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:

  1. NuGet:
Install-Package NHibernate
  1. 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。

更多内容烦请关注我的博客《高先生小屋》

最新文章

  1. 十种MYSQL显错注入原理讲解(一)
  2. oracle中substr与instr
  3. linux之awk、sed命令
  4. host_network_interfaces_slow_mode_thresholds
  5. BZOJ4546: codechef XRQRS
  6. BWT (Burrows–Wheeler_transform)数据转换算法
  7. 拟物设计和Angular的实现 - Material Design(持续更新)
  8. GLSL 基础量定义
  9. hdu4712 Hamming Distance
  10. &lt;T&gt; List&lt;T&gt;前面&lt;T&gt;的意思
  11. JSONP的实现流程
  12. Java基础(00)
  13. Django在form提交CSRF验证失败. 相应中断问题
  14. 潭州课堂25班:Ph201805201 WEB 之 页面编写 第三课 (课堂笔记)
  15. C#中的自动赋值
  16. Android 面试知识集1
  17. C++之类和对象的使用(二)
  18. STM8S——Flash program memory and data EEPROM
  19. python内置模块之itertools
  20. ZH奶酪:纯CSS自定义Html中Checkbox复选框样式

热门文章

  1. BypassUAC
  2. 萌新带你开车上p站(番外篇)
  3. JS在线代码编辑器多种方案monaco-editor,vue-monaco-editor
  4. udp协议与tcp协议
  5. 使用nodejs + wecharty打造你的个人微信机器人
  6. 压缩工具gzip、bzip2、xz的使用
  7. opencv-11-中值滤波及自适应中值滤波
  8. C语言编程入门题目--No.12
  9. 小老板,我学的计算机组成原理告诉我半导体存储器都是断电后丢失的,为什么U盘SSD(固态硬盘)没事呢?
  10. 两个命令把 Vim 打造成 Python IDE