NHibernate for C# (.NET): 完整指南与示例

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

什么是 NHibernate,为什么需要它?

\n\n

NHibernate 是一个功能强大且成熟的 .NET 平台对象关系映射库 (ORM),使用 C# 编写。它是著名的 Java 库 Hibernate 的移植版本。NHibernate 解决了 C# 应用程序中面向对象数据模型与数据库(SQL Server、PostgreSQL、MySQL、Oracle 等)中关系数据模型之间的根本性不匹配问题。

\n\n

NHibernate 的主要任务是自动将 C# 对象(POCO——普通旧 CLR 对象)与数据库表中的记录进行数据转换。您无需为 CRUD 操作(创建、读取、更新、删除)编写数百行重复的 SQL 代码,而是直接操作对象,NHibernate 负责生成并执行 SQL 查询。

\n\n

为什么要使用 NHibernate?

\n
    \n
  • 提高开发效率: 您编写的代码更少,尤其是用于 ADO.NET 的样板代码。
  • \n
  • 减少错误数量: SQL 查询自动生成,从而降低了语法错误和 SQL 注入的风险(在正确使用的情况下)。
  • \n
  • 数据库无关性: 您只需更改连接字符串和 NHibernate 方言即可切换数据库管理系统,而无需重写业务逻辑。
  • \n
  • 缓存管理: 内置的一级和二级缓存机制可显著加快应用程序的运行速度。
  • \n
  • 延迟加载: 关联数据仅在真正需要时才加载,从而节省资源。
  • \n
  • 强大的查询语言: HQL(Hibernate 查询语言)和 LINQ to NHibernate 允许您编写类型安全的查询。
  • \n
\n\n

安装 NHibernate

\n\n

NHibernate 通过 NuGet(.NET 的包管理器)分发。安装非常简单。

\n\n

通过包管理器控制台:

\n
Install-Package NHibernate
\n\n

通过 .NET CLI(适用于 .NET Core / .NET 5+ 项目):

\n
dotnet add package NHibernate
\n\n

其他包(根据需要):

\n
    \n
  • NHibernate.Caches.CoreMemoryCache — 用于二级缓存。
  • \n
  • System.Data.SqlClient 或 Microsoft.Data.SqlClient — 用于 SQL Server。
  • \n
  • Npgsql — 用于 PostgreSQL。
  • \n
  • MySql.Data — 用于 MySQL。
  • \n
\n\n

安装后,您需要配置(通常在 app.config、web.config 或 appsettings.json 文件中,或通过代码中的 Fluent 配置)。

\n\n

快速入门与代码示例

\n\n

我们来看一个使用 NHibernate 的简单示例。假设我们在 SQL Server 数据库中有一个 Products 表。

\n\n

1. 创建实体类:

\n
public class Product\n{\n    public virtual int Id { get; set; }\n    public virtual string Name { get; set; }\n    public virtual decimal Price { get; set; }\n}
\n

重要: 所有属性都必须是 virtual——这是 NHibernate 实现代理机制(延迟加载、更改跟踪)的要求。

\n\n

2. 创建映射文件 (Product.hbm.xml):

\n
<?xml version="1.0" encoding="utf-8" ?>\n<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"\n                   assembly="YourAssemblyName"\n                   namespace="YourNamespace">\n    <class name="Product" table="Products">\n        <id name="Id" column="ProductId">\n            <generator class="native" />\n        </id>\n        <property name="Name" column="Pro                    

推荐