0. 前言
在上一篇基本讲完了 EF Core 的入门级教程。从这一篇开始,我们试着去探索一下 .net core 平台上更多的 ORM 框架。那么,这一篇开始我们就来试试 NHibernate。
1. NHibernate 介绍
NHibernate 是 Hibernate 的 C# 版,众所周知 Hibernate 是 Java 里 ORM 的顶梁柱(至少曾经)。Hibernate 可以说开拓了 Java 的世界,当年 SSH 三驾马车风靡世界,至今 Hibernate 都发挥着举足轻重的作用。
不过,与 EntityFramework 不同的地方是,Hibernate 以配置文件为主,通过配置文件规范使用,Object/Relation 映射。而 NHibernate 这继承了这一点,也是以配置文件优先。下图是 NHibernate 的工作原理:
通过读取 App.config 或者 Web.config 文件去读 NHibernate 的基本配置,然后加载映射文件,建立映射关系。在后续使用中,通过映射关系生成 SQL 语句(这一步跟 EF 是一致的),进而操作数据或者查询数据。
2. 初探 NHibernate
2.1 准备
先来个控制台项目,我起名为 dataprovider。然后安装 NHibernate:
- NuGet:
Install-Package NHibernate
- dotnet core 命令行:
dotnet add package NHibernate
这个文章中使用的 NHibernate 版本是 5.2.7
2.2 配置
需要创建一个项目用的配置文件:App.config.
C# 项目中,除了 Web 类型的项目,每个项目的主配置文件的名称都是 App.config,这是一个固定名称。
文件内容如下:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
</configuration>
在 configuration 节点之间添加以下内容:
<configSections>
<section name="hibernate-configuration" type="NHibernate.Cfg.ConfigurationSectionHandler, NHibernate"/>
</configSections>
这段代码的含义是,在 config 文件中添加一个 hibernate-configuration 结点,结点的解析由类:NHibernate.Cfg.ConfigurationSectionHandler,所在包是 NHibernate。
在 App.config 文件 configuration 结点中添加以下代码:
<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">
<session-factory>
<property name="dialect">NHibernate.Dialect.MsSql2012Dialect</property>
<property name="connection.connection_string">
Data Source=.;Initial Catalog=Demo;Integrated Security=True
</property>
<property name="hbm2ddl.auto">create-drop</property>
<mapping assembly="dataprovider" />
</session-factory>
</hibernate-configuration>
这是固定格式,其中 dialect 表示使用的数据库类型,connection.connection_string 表示连接字符串。mapping 表示映射关系文件所在项目。
2.3 获取 ISessionFactory
然后获取一个 ISessionFactory:
Configuration cfg = new Configuration();
var sessionFactory = cfg.BuildSessionFactory();
当然,如果直接运行代码的话,会在 BuildSessionFactory 这里报错。因为没有为 SQL Server 安装数据访问驱动:
System.Data.SqlClient
将数据访问驱动安装成功后,运行可以获得 sessionFactory。
sessionFactory 用来创建一个访问数据库的 Session
2.4 增删改查
先来个简单的示例类:
public class Cat
{public virtual string Id { get; set;}
public virtual string Name {get; set;}
public virtual char Sex {get; set;}
public virtual float Weight {get; set;}
}
NHibernate 的映射关系文件:Cat.hbm.xml
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="dataprovider" assembly="dataprovider">
<class name="Cat" table="Cat">
<!-- A 32 hex character is our surrogate key. It's automatically
generated by NHibernate with the UUID pattern. -->
<id name="Id">
<column name="CatId" sql-type="char(32)" not-null="true"/>
<generator class="uuid.hex" />
</id>
<!-- A cat has to have a name, but it shouldn't be too long. -->
<property name="Name">
<column name="Name" length="16" not-null="true" />
</property>
<property name="Sex" />
<property name="Weight" />
</class>
</hibernate-mapping>
创建完成后,右键选中文件,修改文件生成操作为 嵌套的资源
然后编写实例代码:
Configuration cfg = new Configuration().Configure();
using (var sessionFactory = cfg.BuildSessionFactory())
using (var session = sessionFactory.OpenSession())
{
// 通过 session 操作
session.Close();}
新增一个 Cat:
var princess = new Cat
{
Name = "Princess",
Sex = 'F',
Weight = 7.4f
};
session.Save(princess);
session.Flush();// 推送修改给数据库,不调用的话数据库里将没有数据
查询并修改:
var cats = session.Query<Cat>().ToList();
var cat = cats.First();
cat.Name = "xiao li";
session.Update(cat);
session.Flush();
查询并删除:
var cats = session.Query<Cat>().ToList();
var cat = cats.First();
session.Delete(cat);
session.Flush();
这是 NHibernate 的入门级的入门教程。嗯,给大家一个 NHibernate 的图:
3. 总结
NHibernate 延续了 Hibernate 的优点,如果之前了解过 Hibernate 的人上手不难。轻量简单,不过得需要配置文件。下一期将带领大家继续深入研究 NHibernate。
更多内容烦请关注我的博客《高先生小屋》