C# 數據操做系列 - 12 NHibernate的增刪改查

0. 前言

上一篇《C# 數據操做系列 - 11 NHibernate 配置和結構介紹》 介紹了Nhibernate裏的配置內容。這一篇將帶領你們瞭解一下如何使用NHIbernate。以前提到NHibernate繼承了Hibernate的一些傳統:使用XML文件進行配置,這一點也是備受爭議。不過,有社區愛好者開發了一個名爲《Fluent NHibernate》的項目,用來支持NHibernate的流式配置。固然,NHibernate自己也提供了NHibernate.Mapping.ByCode模式。不過這一篇暫且略過,留待下文。數據庫

1. NHibernate映射文件

對於NHibernate的映射文件有個約定的名字:session

<類名>.hbm.xmlapp

這裏先爲你們介紹一下映射文件的格式:ide

1.1 hibernate-mapping 的說明

<hibernate-mapping
schema=
"schemaName"                                     (1)
default-cascade="none|save-update"                         (2)
auto-import="true|false"                                 (3)
assembly=
"Eg"                                             (4)
namespace="Eg"                                             (5)
default-access="field|property|field.camecase..."        (6)
default-lazy="true|false"                                 (7)
/>

  1. schema: 數據庫schema的名稱spa

  2. default-cascade:可選項,默認是none,一種默認的級聯風格hibernate

  3. auto-import:明確是否能夠在查詢中使用非限定類名。code

  4. assembly:指定映射對象所在的assembly,通常狀況指的是項目名稱orm

  5. namespace:所在命名空間xml

  6. default-access:可選的,默認是property,表示NHibernate的讀取數據列的策略,默認狀況從Property 中讀取對象

  7. default-lazy:可選的,默認是true,是否啓動延遲加載

1.2 class的配置

通常狀況下,class節點只須要指定name和table就能夠了。接下來,讓咱們探索class如何映射成的。

1.2.1 id

任何一個映射都必須聲明一個數據表的主鍵,大多數類也必須有一個惟一標示字段用來區分不一樣的實例。

這裏介紹一下 id 節點的配置:

<id 
   name=
"PropertyName"
   
type="typename"
   column=
"column_name">
   <generator class="generatorClass"/>
</id>
  • name : 對應的屬性名

  • type:對應的NHibernate類型

  • column:列名

  • generator:主鍵生成器,若是不須要參數能夠直接在 id節點處添加,最經常使用的是native。

1.2.2 property

映射一個普通屬性就簡單多了,只須要進行如下配置便可:

<property
         name=
"propertyName"
         column=
"column_name"
         
type="typename"
/>

  • name :類裏的屬性名

  • column:對應數據表的列名

  • type:數據庫中的類型

1.2.3 many-to-one

在Nhibernate中,多對一的配置是在一的一端,表示該類有一個外鍵導航。

<many-to-one
            name=
"PropertyInOne"
           
class="ManyClass"
            column=
"Column"
            >
</many-to-one>

1.2.4 one-to-one

一對一的關係與多對一的關係比較類似,不一樣的地方在於一對一須要在雙方的映射關係裏均要維護,在有外鍵的表/實體中 添加 constrained=「true」。

示例以下:

<one-to-one name="Person" class="Person"/>
<one-to-one name="Employee" class="Employee" constrained="true"/>

2. 增刪改查

Nhibernate的每次操做都基於一個Session,因此咱們在操做數據庫的時候最好先持有一個可用的Session。接下來,咱們就一個通用數據庫操做類爲基礎,向你們分享一下個人想法。

首先,建立一個泛型模板類,並約束泛型爲類:

public class Repository<T> where T: class
{


}

添加一個ISession屬性,用來後續訪問操做,並由構造方法賦值:

public Repository(ISession session){
   Session = session;
}

public ISession Session { get; }

2.1 新增

如今咱們寫一下新增方法:

public object Add(T entity){
   var key= Session.Save(entity);
   return key;
}

public void Add(params T[] entities){
   foreach (var entity in entities)
   {
       Session.Save(entity);
   }
}

查了下,Save會返回當前持久化對象插入時生成的主鍵。

2.2 修改

NHibernate的修改與EF相似,也是由ISession監控了修改,不用作過多的操做。

2.3 刪除

NHibernate的刪除也十分簡單,直接通知ISession刪除某個持久化對象。

public void Delete(T entity){
   Session.Delete(entity);
}
public void Delete(params T[] entities){
   foreach (var entity in entities)
   {
       Session.Delete(entity);
   }
}

2.4 查詢

一般狀況下,查詢須要結合實際業務來進行開發,固然爲了通用,我在這裏選擇給調用方開放一個查詢對象:

public IQueryable<T> IqQueryable()
{
   return Session.Query<T>();
}

其中 IQueryable是一個接口,表示這是一個可查詢對象,經過Linq能夠快捷的查詢。

3. 總結

嗯,NHibernate基礎使用篇到這裏能夠暫告一段落了。後續的內容有機會再深挖,固然並不表明EF Core就沒有了。嗯嗯,沒毛病。下一篇就讓我來先替大夥看看SugarSQL是什麼狀況吧。

不過在本篇內容完結以前,先補充一個NHibernate的SqlDialect選值:

數據庫 Dialect 備註
DB2 NHibernate.Dialect.DB2Dialect
DB2 for iSeries(OS/400) NHibernate.Dialect.DB2400Dialect
Firebird NHibernate.Dialect.FirebirdDialect 須要設置driver_class爲NHibernate.Driver.FirebirdClientDriver
Informix NHibernate.Dialect.InformixDialect
Informix 9.40 NHibernate.Dialect.InformixDialect0940
Informix 10.00 NHibernate.Dialect.InformixDialect1000
Ingres NHibernate.Dialect.IngresDialect
Ingres 9 NHibernate.Dialect.Ingres9Dialect
Microsoft SQL Server 7 NHibernate.Dialect.MsSql7Dialect
Microsoft SQL Server 2000 NHibernate.Dialect.MsSql2000Dialect
Microsoft SQL Server 2005 NHibernate.Dialect.MsSql2005Dialect
Microsoft SQL Server 2008 NHibernate.Dialect.MsSql2008Dialect
Microsoft SQL Azure Server 2008 NHibernate.Dialect.MsSqlAzure2008Dialect
Microsoft SQL Server 2012 Hibernate.Dialect.MsSql2012Dialect
Microsoft SQL Server Compact Edition NHibernate.Dialect.MsSqlCeDialect
Microsoft SQL Server Compact Edition 4.0 NHibernate.Dialect.MsSqlCe40Dialect
MySQL 3 or 4 NHibernate.Dialect.MySQLDialect
MySQL 5 NHibernate.Dialect.MySQL5Dialect
MySQL 5 InnoDB NHibernate.Dialect.MySQL5InnoDBDialect
MySQL 5.5 NHibernate.Dialect.MySQL55Dialect
MySQL 5.5 Inno DB NHibernate.Dialect.MySQL55InnoDBDialect
Oracle NHibernate.Dialect.Oracle8iDialect
Oracle 9i NHibernate.Dialect.Oracle9iDialect
Oracle 10g, Oracle 11g NHibernate.Dialect.Oracle10gDialect
Oracle 12c NHibernate.Dialect.Oracle12cDialect
PostgreSQL NHibernate.Dialect.PostgreSQLDialect
PostgreSQL 8.1 NHibernate.Dialect.PostgreSQL81Dialect 支持8.1 的 FOR UPDATE NOWAIT
PostgreSQL 8.2 NHibernate.Dialect.PostgreSQL82Dialect 在DROP TABLE和DROP SEQUENCE 語句中支持 IF EXISTS關鍵字
PostgreSQL 8.3 NHibernate.Dialect.PostgreSQL83Dialect 支持XML類型
SQLite NHibernate.Dialect.SQLiteDialect 設置driver_class爲NHibernate.Driver.SQLite20Driver
Sybase Adaptive Server Anywhere 9 NHibernate.Dialect.SybaseASA9Dialect
Sybase Adaptive Server Enterprise 15 NHibernate.Dialect.SybaseASE15Dialect
Sybase SQL Anywhere 10 NHibernate.Dialect.SybaseSQLAnywhere10Dialect
Sybase SQL Anywhere 11 NHibernate.Dialect.SybaseSQLAnywhere11Dialect
Sybase SQL Anywhere 12 NHibernate.Dialect.SybaseSQLAnywhere12Dialect
相關文章
相關標籤/搜索