C# 數據操做系列 - 10 NHibernate初試

0. 前言

在上一篇基本講完了EF Core的入門級教程。從這一篇開始,咱們試着去探索一下 .net core平臺上更多的ORM框架。那麼,這一篇開始咱們就來試試NHibernate。sql

圖片

1. NHibernate 介紹

NHibernate是Hibernate的C#版,衆所周知Hibernate是Java 裏ORM的頂樑柱(至少曾經)。Hibernate能夠說開拓了Java的世界,當年SSH三駕馬車風靡世界,至今Hibernate都發揮着舉足輕重的做用。數據庫

不過,與EntityFramework不一樣的地方是,Hibernate以配置文件爲主,經過配置文件規範使用,Object/Relation 映射。而NHibernate這繼承了這一點,也是以配置文件優先。下圖是 NHibernate的工做原理:session

圖片

經過讀取App.config或者Web.config文件去讀NHibernate的基本配置,而後加載映射文件,創建映射關係。在後續使用中,經過映射關係生成SQL語句(這一步跟EF是一致的),進而操做數據或者查詢數據。app

2. 初探 NHibernate

2.1 準備

先來個控制檯項目,我起名爲dataprovider。而後安裝NHibernate:框架

  1. NuGet:ide

Install-Package NHibernate
  1. dotnet core 命令行:ui

dotnet add package NHibernate

這個文章中使用的NHibernate版本是 5.2.7spa

2.2 配置

須要建立一個項目用的配置文件:App.config..net

C# 項目中,除了Web類型的項目,每一個項目的主配置文件的名稱都是App.config,這是一個固定名稱。hibernate

文件內容以下:

<?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。

相關文章
相關標籤/搜索