.NET 幫助

NHibernate C#(開發人員如何使用)

發佈 2024年6月6日
分享:

NHibernate C#(對開發者的工作原理):圖1 - NHibernate C#的主頁

NHibernate 是一個強大的物件關聯映射 (ORM) 為 .NET 框架設計的框架。它為開發者提供了一種有效的方式,將 .NET 應用程序的面向對象世界與數據庫的關聯世界連接起來。通過使用 NHibernate,您可以顯著減少實現數據訪問層所需的樣板代碼,使您的 .NET 應用程序更清晰、更易於維護。

ORM在簡化資料庫操作中的角色

像NHibernate這樣的ORM框架透過讓開發者以物件及其屬性而非SQL語句的方式處理資料,來簡化與關聯式資料庫的互動。這種抽象化幫助開發者更專注於應用的業務邏輯,而非底層的SQL命令和資料庫架構。例如,NHibernate處理所有的SQL生成和執行,使得插入、刪除和更新等操作可以透過簡單的物件轉換和物件操作來進行。

在 .NET 專案中設定 NHibernate

要在您的 .NET 專案中開始使用 NHibernate,第一步是安裝 NHibernate 套件。這可以透過 Visual Studio 的 NuGet 封裝管理器輕鬆完成,使用以下命令:

Install-Package IronPdf

NHibernate C#(對開發人員如何運作):圖2 - 打開命令行控制台,輸入上述命令來安裝NHibernate

配置 NHibernate 與 XML 配置檔案

NHibernate 安裝完成後,下一步是進行配置。這涉及到創建一個 Hibernate 映射文件,其中詳細描述了資料庫伺服器設置和對象與資料庫表之間的映射細節。主要的 XML 文件通常命名為 hibernate.cfg.xml,包括如資料庫連接字串、方言以及其他資料庫特有的設置。

<?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

理解 NHibernate 的核心組件

NHibernate 的關鍵組件之一是 Session Factory(會話工廠),它是使用工廠設計模式設計的。此組件創建管理與資料庫連接並進行事務操作的 Session(會話)對象。Session Factory 的創建成本較高,因此通常在應用程序的生命週期中只創建一次,使其成為性能優化的關鍵元素。

NHibernate 的關鍵類別和方法

NHibernate 圍繞幾個基本的類別和方法運行。例如,ISession 介面在 NHibernate 中起著基礎作用,促進數據查詢和操作會話的創建。像 OpenSession 這樣的方法幫助開發人員啟動交易,執行 SQL 命令,並使用 SQL 語句或 NHibernate 自己的 HQL 查詢數據庫。 (Hibernate 查詢語言).

使用 NHibernate 將實體對應到資料庫表格

在 NHibernate 中,實體對應是通過對應檔案完成的,這些檔案通常是用 XML 撰寫的。這些檔案通常以實體類名命名。 (例如,Employee.hbm.xml),定義實體屬性如何映射到資料表的欄位。典型的映射檔案包括類別名稱、資料表名稱以及每個屬性的詳細說明,包括主鍵、欄位名和資料型別。

詳細檢視映射檔案中使用的屬性和屬性

在這些映射檔案中,您可以為每個屬性指定各種屬性,例如非空約束或唯一約束。NHibernate還允許進行複雜映射,例如一對多和多對一關係,提供了一套強大的工具來在面向對象的框架內表示關聯數據結構。

在 NHibernate 中執行 SQL 指令和交易

NHibernate 簡化了 CRUD (建立, 讀取, 更新, 刪除) 操作,透過抽象底層的 SQL 命令來實現。開發者可以不寫明確的 SQL 代碼,而是使用 ISession 介面提供的方法來進行這些操作。例如,若要向資料庫添加一個新的實體,只需創建一個對象的新實例,設置其屬性,然後使用 ISessionSave 方法。

使用 ITransaction 管理交易

在 NHibernate 中,交易通過 ITransaction 介面進行管理,以確保資料的完整性和一致性。使用 ISessionBeginTransaction 方法,開發人員可以確保所有操作在提交資料到資料庫之前成功完成,或者如果出現問題則進行回滾, 從而保持資料的穩定性。

完整代碼範例

此範例包含 NHibernate 的配置和映射文件的設置,並演示如何使用 NHibernate 執行創建、讀取、更新和刪除操作。

using NHibernate;
using NHibernate.Cfg;
using System;
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()
    {
        sessionFactory = new Configuration().Configure().BuildSessionFactory();
        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);
            transaction.Commit();
            Console.WriteLine("Employee created: " + newEmployee.Id);
        }
    }
    static void ReadEmployee(int id)
    {
        using (var session = sessionFactory.OpenSession())
        {
            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())
        {
            var employee = session.Get<Employee>(id);
            employee.FirstName = newFirstName;
            session.Update(employee);
            transaction.Commit();
            Console.WriteLine("Employee updated: " + employee.FirstName);
        }
    }
    static void DeleteEmployee(int id)
    {
        using (var session = sessionFactory.OpenSession())
        using (var transaction = session.BeginTransaction())
        {
            var employee = session.Get<Employee>(id);
            session.Delete(employee);
            transaction.Commit();
            Console.WriteLine("Employee deleted");
        }
    }
}
using NHibernate;
using NHibernate.Cfg;
using System;
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()
    {
        sessionFactory = new Configuration().Configure().BuildSessionFactory();
        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);
            transaction.Commit();
            Console.WriteLine("Employee created: " + newEmployee.Id);
        }
    }
    static void ReadEmployee(int id)
    {
        using (var session = sessionFactory.OpenSession())
        {
            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())
        {
            var employee = session.Get<Employee>(id);
            employee.FirstName = newFirstName;
            session.Update(employee);
            transaction.Commit();
            Console.WriteLine("Employee updated: " + employee.FirstName);
        }
    }
    static void DeleteEmployee(int id)
    {
        using (var session = sessionFactory.OpenSession())
        using (var transaction = session.BeginTransaction())
        {
            var employee = session.Get<Employee>(id);
            session.Delete(employee);
            transaction.Commit();
            Console.WriteLine("Employee deleted");
        }
    }
}
Imports NHibernate
Imports NHibernate.Cfg
Imports System
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()
		sessionFactory = (New Configuration()).Configure().BuildSessionFactory()
		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)
			transaction.Commit()
			Console.WriteLine("Employee created: " & newEmployee.Id)
		End Using
		End Using
	End Sub
	Private Shared Sub ReadEmployee(ByVal id As Integer)
		Using session = sessionFactory.OpenSession()
			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()
			Dim employee = session.Get(Of Employee)(id)
			employee.FirstName = newFirstName
			session.Update(employee)
			transaction.Commit()
			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()
			Dim employee = session.Get(Of Employee)(id)
			session.Delete(employee)
			transaction.Commit()
			Console.WriteLine("Employee deleted")
		End Using
		End Using
	End Sub
End Class
VB   C#

資料庫可攜性和互操作性功能

NHibernate 是以資料庫可攜性為設計目標。由於其方言配置,NHibernate 能夠以最少的代碼變更來適應大多數 SQL 資料庫。這意味著您可以從 SQL Server 切換到 MySQL 或 Oracle,而不需要重寫您的數據訪問層。

為各種資料庫系統(如SQL Server)調整NHibernate

NHibernate中的XML設定檔允許開發人員指定特定於其資料庫系統的SQL方言。這使得NHibernate成為一個靈活的解決方案,可以輕鬆適應幾乎所有支持SQL的關聯資料庫,確保您的應用程式在不同的資料庫系統之間具有可移植性。

使用 NHibernate 與 IronPDF

NHibernate C#(開發人員如何運作):圖 3 - IronPDF 的首頁

整合 NHibernate 與 IronPDF 是一個強大的組合,可以增強你的 .NET 應用程式。它允許你使用 NHibernate 管理資料庫操作,同時利用 IronPDF 來 生成 PDF 文件 從您的數據中。考慮到您的應用程式需要提供用戶特定的文件,例如員工報告,這些文件需要生成並以 PDF 格式下載。NHibernate C 可以高效地管理從數據庫中檢索數據的過程,而 IronPDF 可以將這些數據轉換成格式良好的 PDF 文件。

安裝 IronPDF

首先,確保已將 IronPDF 添加到您的專案中。您可以通過 NuGet 套件管理器安裝 IronPDF 套件來完成這一操作。

Install-Package IronPdf
Install-Package IronPdf
'INSTANT VB TODO TASK: The following line uses invalid syntax:
'Install-Package IronPdf
VB   C#

NHibernate C#(對開發者來說如何運作):圖 4 - 透過 NuGet 套件管理器安裝 IronPDF

代碼範例

讓我們更深入了解如何在您的應用程式中實現這一點。在設置 NHibernate 並從資料庫中檢索必要的資料(例如員工詳細信息)後,您將準備一個 HTML 模板,以表示 PDF 文檔應該如何顯示。該 HTML 模板可以被動態填充從 NHibernate 獲取的資料。例如,如果您要為員工生成報告,模板將包括員工的姓名、ID 以及其他相關詳細信息的佔位符。

以下是一個詳細的代碼範例,展示了如何使用 NHibernate 獲取資料並使用 IronPDF 將其轉換為 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 HtmlToPdf 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 HtmlToPdf 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 HtmlToPdf 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
VB   C#

NHibernate C#(它如何為開發人員工作):圖 5 - 上述代碼的示例輸出

在這段代碼中,OpenSession()是一個初始化 NHibernate 會話的方法,用來獲取員工數據。來自 IronPDF 的 ChromePdfRenderer 類然後將填充有獲取到數據的 HTML 範本渲染成 PDF。這個 PDF 存儲在本地,但也可以通過 web 介面直接串流給用戶。

結論

NHibernate C#(開發人員如何運作):圖 6 - IronPDF 授權頁面

在本教程中,我們探討了NHibernate如何簡化.NET應用程式中的資料庫操作,以及它與IronPDF集成如何通過允許生成動態PDF文件來增強功能。NHibernate提供了強大的數據管理工具,而IronPDF則提供了一種便捷的方法,從填充數據的HTML模板創建專業品質的PDF。

IronPDF可供 免費試用, 許可證的起價為$749,提供了一個具有成本效益的解決方案,將強大的PDF生成集成到您的應用程序中。這些工具一起提供了一個全面的解決方案,用於管理數據和生成文件,這對於企業級和較小規模的項目都是理想的選擇。

< 上一頁
Ocelot .NET(對開發人員的運作方式)
下一個 >
Rebus .NET Core 示例(開發人員使用方式)

準備開始了嗎? 版本: 2024.10 剛剛發布

免費 NuGet 下載 總下載次數: 10,993,239 查看許可證 >