
NHibernate C# (jak to działa dla programistów)

NHibernate to potężny framework do mapowania obiektowo-relacyjnego (ORM) zaprojektowany do użytku z .NET Framework. Zapewnia programistom skuteczny sposób na wypełnienie luki między obiektowym światem aplikacji .NET a relacyjnym światem baz danych. Korzystając z NHibernate, można znacznie zmniejszyć ilość kodu szablonowego wymaganego do wdrożenia warstw dostępu do danych, dzięki czemu aplikacje .NET stają się bardziej przejrzyste i łatwiejsze w utrzymaniu.
Rola ORM w upraszczaniu interakcji z bazami danych
Frameworki ORM, takie jak NHibernate, upraszczają interakcje z relacyjnymi bazami danych, umożliwiając programistom pracę z danymi w postaci obiektów i ich właściwości, a nie za pomocą instrukcji SQL. Ta abstrakcja pomaga programistom skupić się bardziej na logice biznesowej swoich aplikacji, a mniej na podstawowych poleceniach SQL i schemacie bazy danych. Na przykład NHibernate obsługuje całe generowanie i wykonywanie kodu SQL, umożliwiając przeprowadzanie operacji, takich jak wstawianie, usuwanie i aktualizowanie, za pomocą prostej konwersji obiektów i manipulacji obiektami.
Konfiguracja NHibernate w projekcie .NET
Aby rozpocząć pracę z NHibernate w projekcie .NET, pierwszym krokiem jest zainstalowanie pakietu NHibernate. Można to łatwo zrobić za pomocą menedżera pakietów NuGet w Visual Studio, używając następującego polecenia:

Konfiguracja NHibernate za pomocą pliku konfiguracyjnego XML
Po zainstalowaniu NHibernate następnym krokiem jest jego konfiguracja. Wymaga to utworzenia pliku mapowania Hibernate, który zawiera szczegółowe ustawienia serwera bazy danych oraz szczegóły mapowania obiektów do tabel bazy danych. Główny plik XML, zazwyczaj noszący nazwę hibernate.cfg.xml, zawiera ustawienia takie jak łańcuch połączenia do bazy danych, dialekt i inne ustawienia specyficzne dla bazy danych.
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">
<session-factory>
<property name="connection.provider">
NHibernate.Connection.DriverConnectionProvider
</property>
<property name="connection.driver_class">
NHibernate.Driver.SqlClientDriver
</property>
<property name="connection.connection_string">
Server=myServerAddress;Database=myDataBase;User Id=myUsername;Password=myPassword;
</property>
<property name="dialect">
NHibernate.Dialect.MsSql2012Dialect
</property>
<property name="show_sql">true</property>
<mapping resource="Employee.hbm.xml"/>
</session-factory>
</hibernate-configuration>
Zrozumienie podstawowych komponentów NHibernate
Jednym z kluczowych komponentów NHibernate jest Session Factory, zaprojektowana z wykorzystaniem wzorca projektowego fabryki. Ten komponent tworzy obiekty Session, które zarządzają połączeniem z bazą danych i przechowują operacje transakcyjne. Utworzenie fabryki sesji jest kosztowne, więc zazwyczaj wykonuje się to tylko raz w całym cyklu życia aplikacji, co czyni ją kluczowym elementem optymalizacji wydajności.
Kluczowe klasy i metody w NHibernate
NHibernate opiera się na kilku kluczowych klasach i metodach. Na przykład, interfejs ISession odgrywa fundamentalną rolę w NHibernate, ułatwiając tworzenie sesji zapytań i manipulacji danymi. Metody takie jak OpenSession pomagają deweloperom rozpoczynać transakcje, wykonywać polecenia SQL oraz przeszukiwać bazę danych za pomocą instrukcji SQL lub własnego języka HQL (Hibernate Query Language) NHibernate.
Mapowanie encji do tabel bazy danych za pomocą NHibernate
Mapowanie encji w NHibernate odbywa się za pomocą plików mapujących, zazwyczaj napisanych w formacie XML. Pliki te, często nazwane na cześć klasy encji (np. Employee.hbm.xml), definiują sposób, w jaki właściwości encji są mapowane na kolumny tabeli bazy danych. Typowy plik mapowania zawiera nazwę klasy, nazwę tabeli oraz szczegóły dotyczące każdej właściwości, w tym klucz główny, nazwę kolumny i typ danych.
Szczegółowe omówienie właściwości i atrybutów używanych w plikach mapowania
W tych plikach mapowania można określić różne atrybuty dla każdej właściwości, takie jak ograniczenia not-null lub ograniczenia unikalności. NHibernate umożliwia również tworzenie złożonych mapowań, takich jak relacje jeden do wielu i wiele do jednego, zapewniając potężny zestaw narzędzi do reprezentowania relacyjnych struktur danych w ramach środowiska obiektowego.
Wykonywanie poleceń SQL i transakcji w NHibernate
NHibernate upraszcza operacje CRUD (tworzenie, odczyt, aktualizacja, usuwanie) poprzez abstrakcję podstawowych poleceń SQL. Deweloperzy mogą wykonywać te operacje bez pisania jawnego kodu SQL, zamiast tego używając metod dostarczonych przez interfejs ISession. Na przykład, aby dodać nową encję do bazy danych, wystarczy utworzyć nową instancję obiektu, ustawić jego właściwości i użyć metody Save interfejsu ISession.
Zarządzanie transakcjami za pomocą ITransaction
Transakcje w NHibernate są zarządzane za pomocą interfejsu ITransaction, który zapewnia integralność i spójność danych. Używając metody BeginTransaction z ISession, deweloperzy mogą zapewnić, że wszystkie operacje są pomyślnie zakończone przed zapisaniem danych do bazy danych lub wycofać zmiany, jeśli coś pójdzie nie tak, zachowując tym samym stabilność danych.
Pełny przykład kodu
Ten przykład obejmuje konfigurację plików konfiguracyjnych i mapujących NHibernate oraz pokazuje, jak wykonywać operacje tworzenia, odczytu, aktualizacji i usuwania przy użyciu NHibernate.
using NHibernate;
using NHibernate.Cfg;
using System;
// Define the Employee class with virtual properties
public class Employee
{
public virtual int Id { get; set; }
public virtual string FirstName { get; set; }
public virtual string LastName { get; set; }
}
class Program
{
private static ISessionFactory sessionFactory;
static void Main()
{
// Initialize the SessionFactory using NHibernate configuration
sessionFactory = new Configuration().Configure().BuildSessionFactory();
// Perform database operations
CreateEmployee();
ReadEmployee(1);
UpdateEmployee(1, "UpdatedName");
DeleteEmployee(1);
}
static void CreateEmployee()
{
using (var session = sessionFactory.OpenSession())
using (var transaction = session.BeginTransaction())
{
var newEmployee = new Employee
{
FirstName = "Iron",
LastName = "Software"
};
session.Save(newEmployee); // Save the new Employee object to the database
transaction.Commit(); // Commit the transaction to finalize the insertion
Console.WriteLine("Employee created: " + newEmployee.Id);
}
}
static void ReadEmployee(int id)
{
using (var session = sessionFactory.OpenSession())
{
// Retrieve the Employee object by its Id
var employee = session.Get<Employee>(id);
Console.WriteLine("Read Employee: " + employee.FirstName + " " + employee.LastName);
}
}
static void UpdateEmployee(int id, string newFirstName)
{
using (var session = sessionFactory.OpenSession())
using (var transaction = session.BeginTransaction())
{
// Get the Employee object by its Id
var employee = session.Get<Employee>(id);
employee.FirstName = newFirstName; // Update the employee's first name
session.Update(employee); // Update the Employee object in the database
transaction.Commit(); // Commit the transaction to save changes
Console.WriteLine("Employee updated: " + employee.FirstName);
}
}
static void DeleteEmployee(int id)
{
using (var session = sessionFactory.OpenSession())
using (var transaction = session.BeginTransaction())
{
// Retrieve the Employee object to be deleted
var employee = session.Get<Employee>(id);
session.Delete(employee); // Delete the Employee from the database
transaction.Commit(); // Commit the transaction to finalize the deletion
Console.WriteLine("Employee deleted");
}
}
}Imports NHibernate
Imports NHibernate.Cfg
Imports System
' Define the Employee class with virtual properties
Public Class Employee
Public Overridable Property Id() As Integer
Public Overridable Property FirstName() As String
Public Overridable Property LastName() As String
End Class
Friend Class Program
Private Shared sessionFactory As ISessionFactory
Shared Sub Main()
' Initialize the SessionFactory using NHibernate configuration
sessionFactory = (New Configuration()).Configure().BuildSessionFactory()
' Perform database operations
CreateEmployee()
ReadEmployee(1)
UpdateEmployee(1, "UpdatedName")
DeleteEmployee(1)
End Sub
Private Shared Sub CreateEmployee()
Using session = sessionFactory.OpenSession()
Using transaction = session.BeginTransaction()
Dim newEmployee = New Employee With {
.FirstName = "Iron",
.LastName = "Software"
}
session.Save(newEmployee) ' Save the new Employee object to the database
transaction.Commit() ' Commit the transaction to finalize the insertion
Console.WriteLine("Employee created: " & newEmployee.Id)
End Using
End Using
End Sub
Private Shared Sub ReadEmployee(ByVal id As Integer)
Using session = sessionFactory.OpenSession()
' Retrieve the Employee object by its Id
Dim employee = session.Get(Of Employee)(id)
Console.WriteLine("Read Employee: " & employee.FirstName & " " & employee.LastName)
End Using
End Sub
Private Shared Sub UpdateEmployee(ByVal id As Integer, ByVal newFirstName As String)
Using session = sessionFactory.OpenSession()
Using transaction = session.BeginTransaction()
' Get the Employee object by its Id
Dim employee = session.Get(Of Employee)(id)
employee.FirstName = newFirstName ' Update the employee's first name
session.Update(employee) ' Update the Employee object in the database
transaction.Commit() ' Commit the transaction to save changes
Console.WriteLine("Employee updated: " & employee.FirstName)
End Using
End Using
End Sub
Private Shared Sub DeleteEmployee(ByVal id As Integer)
Using session = sessionFactory.OpenSession()
Using transaction = session.BeginTransaction()
' Retrieve the Employee object to be deleted
Dim employee = session.Get(Of Employee)(id)
session.Delete(employee) ' Delete the Employee from the database
transaction.Commit() ' Commit the transaction to finalize the deletion
Console.WriteLine("Employee deleted")
End Using
End Using
End Sub
End ClassFunkcje przenośności i interoperacyjności baz danych
NHibernate został zaprojektowany z myślą o przenośności baz danych. Dzięki konfiguracji dialektu NHibernate może dostosować się do większości baz danych SQL przy minimalnych zmianach w kodzie źródłowym. Oznacza to, że można przejść z serwera SQL na MySQL lub Oracle bez konieczności przepisywania warstwy dostępu do danych.
Dostosowanie NHibernate do różnych systemów baz danych, takich jak SQL Server
Pliki konfiguracyjne XML w NHibernate pozwalają programistom określić dialekt SQL specyficzny dla ich systemu baz danych. To sprawia, że NHibernate jest elastycznym rozwiązaniem, które można łatwo dostosować do pracy z praktycznie każdą relacyjną bazą danych obsługującą SQL, zapewniając przenośność aplikacji między różnymi systemami baz danych.
Korzystanie z NHibernate z IronPDF

Integracja NHibernate z IronPDF to potężne połączenie, które może wzbogacić Twoje aplikacje .NET. Pozwala to zarządzać operacjami bazodanowymi za pomocą NHibernate, jednocześnie wykorzystując IronPDF do generowania dokumentów PDF na podstawie danych. Rozważmy scenariusz, w którym aplikacja musi udostępniać dokumenty specyficzne dla użytkownika, takie jak raporty pracowników, które należy wygenerować i pobrać w formacie PDF. NHibernate może efektywnie zarządzać procesami pobierania danych z bazy danych, a IronPDF może konwertować te dane na dobrze sformatowane pliki PDF.
Zainstaluj IronPDF
Najpierw upewnij się, że IronPDF został dodany do Twojego projektu. Można go dodać za pomocą menedżera pakietów NuGet, instalując pakiet IronPDF.

Przykład kodu
Przyjrzyjmy się bliżej, jak wdrożyć to w Twojej aplikacji. Po skonfigurowaniu NHibernate i pobraniu niezbędnych danych z bazy danych, takich jak dane pracowników, przygotujesz szablon HTML przedstawiający wygląd dokumentu PDF. Ten szablon HTML może być dynamicznie wypełniany danymi uzyskanymi z NHibernate. Na przykład, jeśli generujesz raport dla pracownika, szablon zawierałby symbole zastępcze dla imienia i nazwiska pracownika, identyfikatora oraz innych istotnych szczegółów.
Oto szczegółowy przykład kodu, który pokazuje pobieranie danych za pomocą NHibernate i konwertowanie ich do formatu PDF za pomocą IronPDF:
using IronPdf;
using NHibernate;
static void CreateEmployeeReport(int employeeId)
{
// Open a session to interact with the database
using (var session = OpenSession())
{
// Retrieve the employee object based on the provided ID
var employee = session.Get<Employee>(employeeId);
// Create an instance of the ChromePdfRenderer class from IronPDF
var renderer = new ChromePdfRenderer();
// Create the HTML content for the PDF, embedding employee data into the HTML
var htmlTemplate = $@"
<html>
<head>
<title>Employee Report</title>
</head>
<body>
<h1>Employee Details</h1>
<p>Name: {employee.FirstName} {employee.LastName}</p>
<p>ID: {employee.Id}</p>
</body>
</html>";
// Render the HTML string as a PDF document
var pdf = renderer.RenderHtmlAsPdf(htmlTemplate);
// Save the generated PDF to a file
pdf.SaveAs("EmployeeReport.pdf");
}
}Imports IronPdf
Imports NHibernate
Shared Sub CreateEmployeeReport(ByVal employeeId As Integer)
' Open a session to interact with the database
Using session = OpenSession()
' Retrieve the employee object based on the provided ID
Dim employee = session.Get(Of Employee)(employeeId)
' Create an instance of the ChromePdfRenderer class from IronPDF
Dim renderer = New ChromePdfRenderer()
' Create the HTML content for the PDF, embedding employee data into the HTML
Dim htmlTemplate = $"
<html>
<head>
<title>Employee Report</title>
</head>
<body>
<h1>Employee Details</h1>
<p>Name: {employee.FirstName} {employee.LastName}</p>
<p>ID: {employee.Id}</p>
</body>
</html>"
' Render the HTML string as a PDF document
Dim pdf = renderer.RenderHtmlAsPdf(htmlTemplate)
' Save the generated PDF to a file
pdf.SaveAs("EmployeeReport.pdf")
End Using
End Sub
W tym kodzie OpenSession() jest metodą inicjującą sesję NHibernate, która jest używana do pobierania danych pracownika. Następnie klasa ChromePdfRenderer z IronPDF pobiera szablon HTML wypełniony pobranymi danymi i renderuje go jako PDF. Ten plik PDF jest zapisany lokalnie, ale może być również przesyłany strumieniowo bezpośrednio do użytkownika za pośrednictwem interfejsu internetowego.
Wnioski

W tym samouczku omówiliśmy, w jaki sposób NHibernate upraszcza operacje na bazach danych w aplikacjach .NET oraz jak jego integracja z IronPDF zwiększa funkcjonalność, umożliwiając generowanie dynamicznych dokumentów PDF. NHibernate zapewnia solidne narzędzia do zarządzania danymi, a IronPDF oferuje wygodny sposób tworzenia profesjonalnych plików PDF na podstawie szablonów HTML wypełnionych danymi.
IronPDF jest dostępny w ramach bezpłatnej wersji próbnej, a ceny licencji zaczynają się od opłacalnego rozwiązania umożliwiającego integrację zaawansowanego generowania plików PDF z aplikacjami użytkownika. W połączeniu narzędzia te oferują kompleksowe rozwiązanie do zarządzania danymi i tworzenia dokumentów, idealne zarówno dla projektów na skalę Enterprise, jak i tych o mniejszym zasięgu.

Jacob Mellor jest Chief Technology Officer w Iron Software i wizjonerskim inżynierem, pionierem technologii C# PDF. Jako pierwotny deweloper głównej bazy kodowej Iron Software, kształtuje architekturę produktów firmy od jej początku, przekształcając ją wspólnie z CEO Cameron Rimington w firmę liczącą ponad 50 osób, obsługującą NASA, Teslę i światowe agencje rządowe.
Powiązane artykuły


