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

来源:https://www.cnblogs.com/c7jie/archive/2020/05/22/12934996.html
-Advertisement-
Play Games

0. 前言 上一篇《C 數據操作系列 11 NHibernate 配置和結構介紹》 介紹了Nhibernate里的配置內容。這一篇將帶領大家瞭解一下如何使用NHIbernate。之前提到NHibernate繼承了Hibernate的一些傳統:使用XML文件進行配置,這一點也是備受爭議。不過,有社區愛 ...


0. 前言

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

1. NHibernate映射文件

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

<類名>.hbm.xml

這裡先為大家介紹一下映射文件的格式:

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的名稱
  2. default-cascade:可選項,預設是none,一種預設的級聯風格
  3. auto-import:明確是否可以在查詢中使用非限定類名。
  4. assembly:指定映射對象所在的assembly,一般情況指的是項目名稱
  5. namespace:所在命名空間
  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

更多內容煩請關註我的博客《高先生小屋》

file


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 在Linux上搭建基於開源技術的nuget私人保密倉庫 前言 在Linux上搭建nuget私人倉庫一直是一個老大難的問題,主要涉及到以下難點: nuget.org官方使用的Nuget.Server基於.NET Framework的ASP.NET,而不是ASP.NET Core,因此是Windows ...
  • 網上有很多Socket框架,但是我想,C#既然有Socket類,難道不是給人用的嗎? 寫了一個SocketServerHelper和SocketClientHelper,分別隻有5、6百行代碼,比不上大神寫的,和業務代碼耦合也比較重,但對新手非常友好,容易看懂。 支持返回值或回調,支持不定長度的數據 ...
  • 動手寫一個簡版 asp.net core Intro 之前看到過蔣金楠老師的一篇 200 行代碼帶你瞭解 asp.net core 框架,最近參考蔣老師和 Edison 的文章和代碼,結合自己對 asp.net core 的理解 ,最近自己寫了一個 MiniAspNetCore ,寫篇文章總結一下。 ...
  • 在微軟的Build 2020開發者大會中,微軟就正在成形的C#9.0的一些即將添加的主要特性進行了說明。 1.init屬性訪問器 對象初始化方式對於創建對象來說是一種非常靈活和可讀的格式,特別是對樹狀嵌入型對象的創建。簡單的例如 new Person { FirstName = "Scott", L ...
  • 作為一個老司機,怎能沒有自己的私人代碼倉庫? 前言 Github大家都熟悉。 除了開源的項目外,有時候,大家也會把自己或團隊、公司的項目傳到Github的私有倉庫里,把Github當成自己的私人Git Server。 但是,用Github會有一些問題: Github從國內訪問不是很穩定,有時候會很慢 ...
  • 前言 大概3個星期之前立項, 要做一個 CEF+Blazor+WinForms 三合一到同一個進程的客戶端模板. 這個東西在五一的時候做出了原型, 然後慢慢修正, 在5天之前就上傳到github了. 地址 : https://github.com/BlazorPlus/BlazorCefApp 但是 ...
  • 在開發環境的電腦上可生成報表,但是一到客戶端就提示An error occurred during local report processing錯誤。 我把 Microsoft.ReportViewer.Common.dll Microsoft.ReportViewer.WinForms.dll ...
  • 在開始本篇正文之前,解決一個 @瘋瘋過 指出的錯誤,再次感謝指正。 步驟如下: 刪掉 層中的項目引用,添加nuget依賴包 ,可以使用命令: 在 層中引用項目 ,在模塊類中添加依賴 將 層中的引用項目 改成 。 上一篇文章(https://www.cnblogs.com/meowv/p/129244 ...
一周排行
    -Advertisement-
    Play Games
  • Dapr Outbox 是1.12中的功能。 本文只介紹Dapr Outbox 執行流程,Dapr Outbox基本用法請閱讀官方文檔 。本文中appID=order-processor,topic=orders 本文前提知識:熟悉Dapr狀態管理、Dapr發佈訂閱和Outbox 模式。 Outbo ...
  • 引言 在前幾章我們深度講解了單元測試和集成測試的基礎知識,這一章我們來講解一下代碼覆蓋率,代碼覆蓋率是單元測試運行的度量值,覆蓋率通常以百分比表示,用於衡量代碼被測試覆蓋的程度,幫助開發人員評估測試用例的質量和代碼的健壯性。常見的覆蓋率包括語句覆蓋率(Line Coverage)、分支覆蓋率(Bra ...
  • 前言 本文介紹瞭如何使用S7.NET庫實現對西門子PLC DB塊數據的讀寫,記錄了使用電腦模擬,模擬PLC,自至完成測試的詳細流程,並重點介紹了在這個過程中的易錯點,供參考。 用到的軟體: 1.Windows環境下鏈路層網路訪問的行業標準工具(WinPcap_4_1_3.exe)下載鏈接:http ...
  • 從依賴倒置原則(Dependency Inversion Principle, DIP)到控制反轉(Inversion of Control, IoC)再到依賴註入(Dependency Injection, DI)的演進過程,我們可以理解為一種逐步抽象和解耦的設計思想。這種思想在C#等面向對象的編 ...
  • 關於Python中的私有屬性和私有方法 Python對於類的成員沒有嚴格的訪問控制限制,這與其他面相對對象語言有區別。關於私有屬性和私有方法,有如下要點: 1、通常我們約定,兩個下劃線開頭的屬性是私有的(private)。其他為公共的(public); 2、類內部可以訪問私有屬性(方法); 3、類外 ...
  • C++ 訪問說明符 訪問說明符是 C++ 中控制類成員(屬性和方法)可訪問性的關鍵字。它們用於封裝類數據並保護其免受意外修改或濫用。 三種訪問說明符: public:允許從類外部的任何地方訪問成員。 private:僅允許在類內部訪問成員。 protected:允許在類內部及其派生類中訪問成員。 示 ...
  • 寫這個隨筆說一下C++的static_cast和dynamic_cast用在子類與父類的指針轉換時的一些事宜。首先,【static_cast,dynamic_cast】【父類指針,子類指針】,兩兩一組,共有4種組合:用 static_cast 父類轉子類、用 static_cast 子類轉父類、使用 ...
  • /******************************************************************************************************** * * * 設計雙向鏈表的介面 * * * * Copyright (c) 2023-2 ...
  • 相信接觸過spring做開發的小伙伴們一定使用過@ComponentScan註解 @ComponentScan("com.wangm.lifecycle") public class AppConfig { } @ComponentScan指定basePackage,將包下的類按照一定規則註冊成Be ...
  • 操作系統 :CentOS 7.6_x64 opensips版本: 2.4.9 python版本:2.7.5 python作為腳本語言,使用起來很方便,查了下opensips的文檔,支持使用python腳本寫邏輯代碼。今天整理下CentOS7環境下opensips2.4.9的python模塊筆記及使用 ...