在上一篇基本讲完了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 NHibernatedotnet 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 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>NHibernate.Dialect.MsSql2012Dialect</property> <property> Data Source=.;Initial Catalog=Demo;Integrated Security=True </property> <property>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 table="Cat"> <!-- A 32 hex character is our surrogate key. It's automatically generated by NHibernate with the UUID pattern. --> <id> <column sql-type="char(32)" not-null="true"/> <generator /> </id> <!-- A cat has to have a name, but it shouldn't be too long. --> <property> <column length="16" not-null="true" /> </property> <property /> <property /> </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的图: