C#——Nhibernate探索

来源:https://www.cnblogs.com/kiba/archive/2018/07/16/9310967.html
-Advertisement-
Play Games

C#—Nhibernate探索 本篇文章,讓我們一起來探索Nhibernate。 首先我們去搜索Nhibernate下載地址,如下鏈接所示。 該版本可能是最新版,我下載的4.0.4.GA。其中GA意思我沒搞清楚。不過應該不重要。 https://sourceforge.net/projects/nh ...


 C#—Nhibernate探索

本篇文章,讓我們一起來探索Nhibernate。

首先我們去搜索Nhibernate下載地址,如下鏈接所示。

該版本可能是最新版,我下載的4.0.4.GA。其中GA意思我沒搞清楚。不過應該不重要。

https://sourceforge.net/projects/nhibernate/

分析文件內容

下載完成後,解壓縮,我們看到文件夾內容如下圖所示。

 

我們可以分析得出,其中Required_Bins存儲的是類庫和其他資源;字面的意思Required,是必須文件。

打開Required文件夾,我們看到裡面是這樣的。

這裡有兩個類庫;可以分析得出,這兩個類庫是要被引用的。

類庫擁有對應的XML,沒找到具體使用該XML的方法。所以暫時不去理他。

NHibernate.pdb應該是沒有用的。估計是作者忘記刪除了。

nhibernate-configuration.xsd和nhibernate-mapping.xsd兩個文件暫時不知道要乾什麼用的。

但看到.xsd文件,第一時間反應,他們應該是用來幫助開發者,快速生成配置文件用的。為了保險起見,我們上網查詢一下。

查詢結果:

查詢結果是,他們倆是【文件智能提示功能】用的。

且nhibernate-configuration.xsd和nhibernate-mapping.xsd是要放到c盤的,路徑如下:

C:\Program Files (x86)\Microsoft Visual Studio 11.0\Xml\Schemas

因為是我用的是vs2012,所以,我找的路徑是Microsoft Visual Studio 11.0。並將文件放在了那裡面。

雖然感覺,這倆文件好像不是這麼用的,但由於可以判斷它們並不影響程式運行,所以,先且不管他們,等程式運行起來後,再刪除他們試試。

 

再之後,我上網調查了下Nhibernate的應用。

上網調查後,發現Nhibernate有Castle框架、LinFu框架、Spring.Net三種。

看起來很複雜,文章有很多,寫的又很複雜,於是我放棄調查,直接嘗試使用,首先第一步,直接引用類庫。

 

一、建立了一個類庫程式,引用Iesi.Collections.dll和NHibernate.dll兩個DLL。 

接下來,我們開始建立持久化對象。

public class Test 
 { 
        public virtual int Id { get; set; } 
        public virtual string Name { get; set; } 
}

接下來建立持久化對象與資料庫的映射。再次上網調查。

調查結果:

對象與資料庫的映射是保存在XML文件中的,於是我配置XML映射文件如下。

該XML文件的屬性,要求設置其生成操作為【嵌入的資源】。

但我怕它丟失,還給他設置了始終複製的屬性。

XML文件如下:

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
   assembly="NherbinateHelper"
   namespace="NherbinateHelper">
  <class name ="Test">
    <id name="Id" column ="Id">
      <generator class ="native"/>
    </id>
    <property name ="Name"/>
  </class>
</hibernate-mapping>

再然後,我需要建立資料庫連接的類。

再次上網調查。編寫NHibernateHelper如下。

 public class NHibernateHelper
    {
        private ISessionFactory _sessionFactory;
        public NHibernateHelper()
        {
            _sessionFactory = GetSessionFactory();
        }
        private ISessionFactory GetSessionFactory()
        {
            return (new Configuration()).Configure().BuildSessionFactory();
        }
        public ISession GetSession()
        {
            return _sessionFactory.OpenSession();
        }
}

因為我們沒有顯示設置資料庫連接字元串,所以,如果程式可以運行,那麼這個類,一定會讀配置文件中SQL字元串連接。

然後,我們建立domain(域),添加對Text持久化對象的增刪改查的方法。

public class NHibernateSample
    {
        protected ISession Session { get; set; }
        public NHibernateSample(ISession session)
        {
            Session = session;
        }
        public void CreateCustomer(Test test)
        {
            Session.Save(test);
            Session.Flush();
        }
        public Test GetCustomerById(int Id)
        {
            return Session.Get<Test>(Id);
        }
    }

再然後,我們新建一個控制台程式,用於測試我們編寫的這個NHibernate,是否可以正常運行。

編寫測試類代碼如下。

public class NHibernateSampleFixture
{
        private NHibernateSample _sample;
        public NHibernateSampleFixture()
        {
            _sample = new NHibernateSample(new  NHibernateHelper().GetSession());
        }
        public void GetCustomerByIdTest()
        {
            var tempCutomer = new Test {  Name = "李" };
            _sample.CreateCustomer(tempCutomer);
            Test customer = _sample.GetCustomerById(1);
            int customerId = customer.Id;
        }
}

main函數調用如下:

class Program 
    { 
        static void Main(string[] args) 
        { 
            NHibernateSampleFixture f = new NHibernateSampleFixture(); 
            f.GetCustomerByIdTest(); 
        } 
}

測試結果是失敗,因為,我們還沒有在任何地方設置資料庫連接字元串。所以推斷,缺少了配置資料庫連接的文件。

接著,我打開文件夾了Configuration_Templates。

發現Configuration_Templates文件夾下有如下文件。

 

我推斷,這裡就是資料庫連接字元串的模板。

由於我使用的資料庫是sqlserver,所以,我複製了mssql.cfg.xml。

然後將複製的文件,黏貼到測試的控制台程式下,然後改名為《hibernate.cfg.xml》。

這裡測試了下,貌似不改名不好使,配置文件內容如下

【PS:我始終沒搞懂,XML中的CFG代表什麼意思。】

<?xml version="1.0" encoding="utf-8"?>  
<hibernate-configuration  xmlns="urn:nhibernate-configuration-2.2" > 
    <session-factory name="NHibernate.Test"> 
        <property name="connection.driver_class">NHibernate.Driver.SqlClientDriver</property> 
        <property name="connection.connection_string"> 
      Server=SKY-20160718RXO\SA;initial catalog=Nherbinate;Integrated Security=SSPI; 
    </property> 
        <property name="dialect">NHibernate.Dialect.MsSql2012Dialect</property> 
    <mapping assembly="NherbinateHelper"/> 
  </session-factory> 
</hibernate-configuration>

因為我連接的是sqlserver2012,所以配置文件里,我將原始版SQL2008的property 修改為

<property name="dialect">NHibernate.Dialect.MsSql2012Dialect</property> 

註意

其中<mapping assembly="NherbinateHelper"/>是後加的,原文件里沒有。

這句話的意思是,映射我創建的那個類庫。

我推斷,Nherbinate是讀這個配置文件,然後到這個程式集里,反射查詢那些poco對象。

最後,nhibernate-configuration-2.2這句話我想了很久要不要改成4.0。

結果是我沒改,測試一切正常。可以順利使用。

 結語

這是一場Nhibernate探索之旅,結果是非常順利的配置成功了。共耗時2小時。

為什麼說是探索之旅呢,因為,我也是首次配置Nhibernate,我平常更多的是使用Entity Framework。

文中使用了一些推斷,猜測的詞語。那是因為,真的是在推斷的。我並不清楚那幾個點的原理和含義,因為我沒看Nhibernate的原代碼。

雖然本文是講述,配置Nhibernate;但我更想講述的是,面對未知的框架入手學習和使用的方法。

我描述了自身一步一步配置Nhibernate的路徑,我覺得還算高效,大家也可以效仿,用來學習陌生框架。

當然不必太追求速度,因為每個人的基礎不一樣。我比較熟悉Entity Framework。所以學習Nhibernate就會比較快。

如果你還沒接觸過ORM,那自然就會慢一點。

 

----------------------------------------------------------------------------------------------------

註:此文章為原創,歡迎轉載,請在文章頁面明顯位置給出此文鏈接!
若您覺得這篇文章還不錯請點擊下右下角的推薦,非常感謝!


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

-Advertisement-
Play Games
更多相關文章
  • 深度拷貝指的是將一個引用類型(包含該類型里的引用類型)拷貝一份(在記憶體中完完全全是兩個對象,沒有任何引用關係).......... 直接上代碼: 1 /// <summary> 2 /// 對象的深度拷貝(序列化的方式) 3 /// </summary> 4 public static class ...
  • 解決方法:項目右鍵屬性 > 生成 > 找到最下麵的高級按鈕,點擊高級按鈕 > 常規 > 語言版本 > 選擇 C#最新次要版本,或者比當前版本更高的版本即可,點擊確定,然後保存即可。 ...
  • 貓頭鷹地圖下載器,支持多風格瓦片下載,開發個性化地圖利器,可以下載預設定義樣式,也可下載自定義樣式 以上圖片是常規的地圖下載,以下圖片是個性化地圖的下載 還有更多的請下載軟體體驗,軟體下載地址如下: http://api.jjszd.com:8081/apituiguang/%E7%8C%AB%E5 ...
  • 1. 2. 3 . ...
  • 由於捆綁壓縮會對所有包含的文件進行壓縮,無法設置忽略對某個js文件的壓縮。導致壓縮該js後,腳本出錯的問題。 解決方式: 重寫 ScriptBundle 的 GenerateBundleResponse 。代碼如下 用法: ...
  • 裝箱: 值類型轉為引用類型拆箱: 引用類型轉為值類型 裝箱 一般值類型存儲自棧中 轉為引用類型的時候 要在堆中 申請一個記憶體 存儲變數 拆箱 將堆中索引為0的變數 壓入到棧中 拆箱指令unbox.any 將引用類型轉為值類型 賦給值類型變數 ...
  • 前文 由於經常用到串口調試, 儘管有現成的軟體, 因為前端時間涉及一個二次開發, 就因為一個RtsEnable設置, 折騰半天, 網上各種版本的也很多, 功能擴展的很開也多。所以現在自己做了一個夠用版,基於自己的需求,簡單的實現發送接收功能, 至於那些擴展功能可以自己根據需求添加。 正文 先上個運行 ...
  • 一、情景引入 項目需求:對於一個數據表(表A)的增、刪、改全部要有日誌記錄,日誌表(表B)結構 中需要記錄表A的自增ID,這樣才能將日誌與操作的數據一一對應起來。 對於刪和改都好辦,獲取Model時都可以取到這個自增ID,然後就可以存入日誌表,但是如果新增一條數據,應該如何獲取到這個自增ID呢?不知 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...