.NET 帮助

NHibernate C#(它是如何为开发人员工作的)

发布 2024年六月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

使用 XML 配置文件配置 NHibernate

一旦安装了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 的创建成本很高,因此通常在每个应用程序的生命周期中只创建一次,这使其成为性能优化的关键元素。

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,而无需重写数据访问层。

将NHibernate调整为适应各种数据库系统,如SQL Server

NHibernate 中的 XML 配置文件允许开发人员指定与其数据库系统特定的 SQL 方言。 这使得NHibernate成为一个灵活的解决方案,可以轻松适用于几乎所有支持SQL的关系数据库,确保您的应用程序能够在不同的数据库系统之间移植。

将 NHibernate 与 IronPDF 结合使用

NHibernate C#(如何为开发人员工作):图 3 - IronPDF 主页

将NHibernate集成到IronPDF是一个强大的组合,可以增强您的.NET应用程序。 它允许您在利用IronPDF的同时管理NHibernate的数据库操作。生成 PDF 文档从您的数据中。 考虑一种情境,您的应用程序需要提供特定用户的文档,例如员工报告,这些文档需要以PDF格式生成和下载。 NHibernate C 可以高效管理从数据库检索数据的过程,而 IronPDF 可以将这些数据转换为格式良好的 PDF 文件。

安装 IronPDF

首先,确保 IronPDF 已添加到您的项目中。 您可以通过安装IronPDF包来通过NuGet包管理器包含它。

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 文件已保存在本地,但也可以通过网络界面直接流式传输到用户。

结论

NHibernate C#(如何为开发人员工作):图 6 - IronPDF 许可页面

在本教程中,我们探讨了NHibernate如何简化 .NET 应用程序中的数据库操作,以及它与IronPDF的集成如何通过允许生成动态PDF文档来增强功能。 NHibernate 提供强大的数据管理工具,而 IronPDF 提供了一种方便的方法,可以从填充数据的 HTML 模板创建专业质量的 PDF。

IronPDF 可用于以下用途免费试用,许可证起价为 $749,提供了一种具有成本效益的解决方案,用于将强大的 PDF 生成功能集成到您的应用程序中。 这些工具共同提供了一个全面的解决方案,用于管理数据和生成文档,非常适合企业级和较小规模的项目。

< 前一页
Ocelot .NET(开发人员如何使用)
下一步 >
Rebus .NET Core 示例(对开发人员的工作原理)

准备开始了吗? 版本: 2024.12 刚刚发布

免费NuGet下载 总下载量: 11,622,374 查看许可证 >