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:
Install-Package NHibernate

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, zwykle o nazwie hibernate.cfg.xml, zawiera ustawienia, takie jak ciąg połączenia z bazą 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>
<?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ń o dane i manipulacji danymi. Metody takie jak OpenSession pomagają programistom rozpoczynać transakcje, wykonywać polecenia SQL oraz wysyłać zapytania do bazy danych przy użyciu instrukcji SQL lub własnego języka HQL (Hibernate Query Language) biblioteki 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. Programiści mogą wykonywać te operacje bez pisania jawnego kodu SQL, korzystając zamiast tego z metod udostępnianych przez interfejs ISession. Na przykład, aby dodać nowy obiekt do bazy danych, wystarczy utworzyć nową instancję obiektu, ustawić jego właściwości i użyć metody Save klasy ISession.
Zarządzanie transakcjami za pomocą ITransaction
Transakcje w NHibernate są zarządzane za pośrednictwem interfejsu ITransaction, który zapewnia integralność i spójność danych. Korzystając z metody BeginTransaction z ISession, programiści mogą zapewnić, że wszystkie operacje zostaną pomyślnie zakończone przed zapisaniem danych w bazie danych, lub cofnąć zmiany, jeśli coś pójdzie nie tak, zachowując w ten sposób 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");
}
}
}
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 Class
Funkcje 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.
Install-Package 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");
}
}
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() to metoda inicjująca sesję NHibernate, która służy do pobierania danych pracowników. Następnie klasa ChromePdfRenderer z IronPDF pobiera szablon HTML wypełniony pobranymi danymi i renderuje go jako plik 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.
Często Zadawane Pytania
Jak zintegrować NHibernate z biblioteką do generowania plików PDF w języku C#?
NHibernate można zintegrować z IronPDF, wykorzystując NHibernate do obsługi operacji bazodanowych i pobierania danych, które IronPDF może następnie przekształcić w dokumenty PDF. Pozwala to na generowanie dynamicznych plików PDF na podstawie danych specyficznych dla użytkownika.
Jaki jest cel Session Factory w NHibernate?
W NHibernate Session Factory jest kluczowym komponentem, który tworzy obiekty Session w celu zarządzania połączeniami z bazą danych i wykonywania operacji transakcyjnych. Optymalizuje wydajność, ponieważ jego utworzenie jest kosztowne i zazwyczaj jest instancjonowany tylko raz w całym cyklu życia aplikacji.
Czy możesz wyjaśnić, w jaki sposób operacje CRUD są wykonywane w NHibernate?
Operacje CRUD w NHibernate są abstrakcyjne poprzez interfejs `ISession`, który udostępnia metody takie jak Save, Update i Delete. Pozwala to programistom na wykonywanie tych operacji bez konieczności bezpośredniego pisania poleceń SQL.
Jakie są korzyści z używania NHibernate dla programistów .NET?
NHibernate przynosi korzyści programistom .NET poprzez zmniejszenie ilości kodu szablonowego wymaganego dla warstw dostępu do danych, zwiększając tym samym łatwość utrzymania aplikacji. Abstrahuje również interakcje z bazą danych, pozwalając programistom skupić się bardziej na logice biznesowej.
W jaki sposób NHibernate wspiera przenoszenie baz danych?
NHibernate obsługuje przenośność baz danych dzięki konfiguracji dialektów, co pozwala mu dostosować się do różnych baz danych SQL. Dzięki temu programiści mogą przechodzić z jednego systemu baz danych na inny przy minimalnych zmianach w kodzie.
Jaka jest rola plików mapowania w NHibernate?
Pliki mapowania w NHibernate, zazwyczaj pliki XML, definiują sposób mapowania właściwości encji na kolumny w tabeli bazy danych. Zawierają one ważne szczegóły, takie jak klucze główne, nazwy kolumn i typy danych, obsługując złożone mapowania, takie jak relacje typu „jeden do wielu”.
Jak skutecznie zarządzać transakcjami w NHibernate?
Transakcje w NHibernate są zarządzane za pomocą interfejsu `ITransaction`, który zapewnia integralność danych. Programiści mogą używać metody BeginTransaction z `ISession` do obsługi operacji, zatwierdzając dane tylko wtedy, gdy wszystkie operacje zakończą się powodzeniem, lub cofając je, jeśli pojawią się jakiekolwiek problemy.
Jak skonfigurować NHibernate w projekcie .NET?
Aby skonfigurować NHibernate, zainstaluj pakiet NHibernate za pomocą menedżera pakietów NuGet w Visual Studio, używając polecenia Install-Package NHibernate. Skonfiguruj go za pomocą pliku mapowania XML, takiego jak `hibernate.cfg.xml`, aby zdefiniować ustawienia bazy danych i mapowania obiektów.




