溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

C#中NHibernate結(jié)構(gòu)是什么

發(fā)布時(shí)間:2021-11-24 13:49:59 來(lái)源:億速云 閱讀:110 作者:iii 欄目:大數(shù)據(jù)

本篇內(nèi)容介紹了“C#中NHibernate結(jié)構(gòu)是什么”的有關(guān)知識(shí),在實(shí)際案例的操作過(guò)程中,不少人都會(huì)遇到這樣的困境,接下來(lái)就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

1. NHibernate結(jié)構(gòu)

先給小伙伴們放個(gè)圖:

C#中NHibernate結(jié)構(gòu)是什么

這是NHibernate的整體結(jié)構(gòu)圖。NHibernate通過(guò)ADO.NET 建立訪問(wèn)數(shù)據(jù)庫(kù)的連接,然后封裝了一個(gè)Transaction(事務(wù))工廠和一個(gè)Session工廠。每次操作的時(shí)候,通過(guò)兩個(gè)工廠獲取對(duì)應(yīng)的Session/Transaction示例操作數(shù)據(jù)對(duì)象。

ISessionFactory - NHibernate.ISessionFactory:

一個(gè)基于單數(shù)據(jù)庫(kù)的已編譯的映射緩存,它是持久不變的且線程安全(額,這句話是從它的文檔翻譯過(guò)來(lái)的)。是一個(gè)提供ISession的工廠類,同時(shí)也是一個(gè) IConnectionProvider的客戶端??梢栽O(shè)置一個(gè)在事務(wù)之間的進(jìn)程級(jí)或集群級(jí)的二級(jí)緩存。

ISession - NHibernate.ISession:

一個(gè)單線程、短生命周期的對(duì)象,表示從應(yīng)用程序和數(shù)據(jù)持久化之間一個(gè)連接。一個(gè)ADO.NET連接的封裝,用來(lái)提供ITransaction的工廠。提供了一個(gè)通過(guò)主鍵檢索對(duì)象和導(dǎo)航鏈接查詢對(duì)象時(shí)的一級(jí)緩存。也就是EF Core中的導(dǎo)航屬性。

Persistent Objects and Collections(持久化對(duì)象和集合):

一些單線程、短生命周期對(duì)象其中包含持久化狀態(tài)和業(yè)務(wù)方法。它們可能只是一些普通的POCO,僅僅是與ISession中關(guān)聯(lián)起來(lái)了。只要ISession關(guān)閉了,這些對(duì)象就可以被分離出來(lái)然后可以在應(yīng)用層的任意地方使用。

Transient Objects and Collections(臨時(shí)對(duì)象和集合):

表示臨時(shí)的未被ISession托管的持久化對(duì)象,它們被應(yīng)用層臨時(shí)創(chuàng)建但直到ISession關(guān)閉都不會(huì)被持久化。

ITransaction - NHibernate.ITransaction:

這個(gè)是可選的。表示一個(gè)單線程、短生命周期的對(duì)象,被應(yīng)用程序用來(lái)限制一個(gè)原子的工作單元,基于ADO.NET 的Transaction的抽象。一個(gè)ISession可能會(huì)開(kāi)啟多個(gè)事務(wù),Transaction scopes may be used instead(原話是這個(gè),大意是可以改用事務(wù)作用域)。

IConnectionProvider - NHibernate.Connection.IConnectionProvider:

也是可選的,是一個(gè)用來(lái)創(chuàng)建ADO.NET Connection和Command的工廠?;贒bConnection和DbCommand實(shí)現(xiàn),并非直接暴露給應(yīng)用程序,但是可以由開(kāi)發(fā)者對(duì)其進(jìn)行擴(kuò)展或?qū)崿F(xiàn)。

IDriver -NHibernate.Driver.IDriver:

可選的,驅(qū)動(dòng)接口,用來(lái)封裝隱藏不同ADO.NET 數(shù)據(jù)提供程序之間的不同。例如:參數(shù)化等。

ITransactionFactory - NHibernate.Transaction.ITransactionFactory:

可選的,事務(wù)實(shí)現(xiàn)工廠,不對(duì)應(yīng)用程序公開(kāi),但開(kāi)發(fā)者可以對(duì)其進(jìn)行擴(kuò)展或?qū)崿F(xiàn)。

2. 實(shí)例狀態(tài)

在NHibernate中,一個(gè)可持久化的對(duì)象有三種不同的狀態(tài),依據(jù)與持久化上下文之間的關(guān)系不同,其中ISession就是一個(gè)持久化上下文。狀態(tài)分為以下三種:

  • transient 暫存的、臨時(shí)的 該狀態(tài)的對(duì)象并沒(méi)有被持久化上下文捕獲到,簡(jiǎn)單來(lái)講就是剛被創(chuàng)建,還沒(méi)有從數(shù)據(jù)庫(kù)/持久化上下文中獲取到主鍵信息。

  • persistent 持久化的 該狀態(tài)的對(duì)象表示已經(jīng)被上下文正確獲取到了,持久化上下文能夠監(jiān)控到對(duì)象的變化。持久化上下文中持有一個(gè)指向該對(duì)象的引用。這種狀態(tài)通常是從數(shù)據(jù)庫(kù)中獲取到數(shù)據(jù)或者新建的數(shù)據(jù)附加到了上下文中。

  • detached 游離態(tài) 該狀態(tài)的對(duì)象是從上下文中分離出來(lái)的,有了數(shù)據(jù)庫(kù)主鍵,曾經(jīng)或現(xiàn)在仍然有一條數(shù)據(jù)庫(kù)記錄與之對(duì)應(yīng)。造成的原因可能有,上下文關(guān)閉了;該對(duì)象是在另一個(gè)上下文中持久化的,它對(duì)于當(dāng)前上下文是游離態(tài)的。

3. 配置項(xiàng)介紹

NHibernate中常用的配置

  • dialect

    數(shù)據(jù)庫(kù)方言,表示NHibernate連接的數(shù)據(jù)庫(kù)是什么,該用哪種格式解析關(guān)系映射到數(shù)據(jù)庫(kù)SQL語(yǔ)句

  • default_schema

    默認(rèn)的schema,用來(lái)設(shè)置連接字符串連接的數(shù)據(jù)庫(kù)默認(rèn)的schema。

  • connection.provider

    數(shù)據(jù)庫(kù)連接的提供程序,默認(rèn)是NHibernate.Connection.DriverConnectionProvider. 填繼承自 IConnectionProvider 的實(shí)現(xiàn)類

  • connection.connection_string

    數(shù)據(jù)庫(kù)連接字符串

  • connection.connection_string_name

    數(shù)據(jù)庫(kù)連接字符串的名稱,指的是配置在程序的配置文件中 connectionStrings節(jié)點(diǎn)的數(shù)據(jù)連接字符串。

  • max_fetch_depth

    最大遞歸深度,表示一次查詢中直接加載的導(dǎo)航屬性深度。默認(rèn)是不直接加載導(dǎo)航屬性,基于延遲加載的邏輯,由實(shí)際使用時(shí)才從數(shù)據(jù)庫(kù)中加載數(shù)據(jù)。

  • show_sql

    是否在控制臺(tái)中打印轉(zhuǎn)換的SQL語(yǔ)句,一般在調(diào)試的過(guò)程中會(huì)設(shè)置為true,用來(lái)確認(rèn)生成的SQL是否正確等。

  • hbm2ddl.auto

    該值表示每次ISessionFactory創(chuàng)建的時(shí)候,是否自動(dòng)生成DDL語(yǔ)句并提交數(shù)據(jù)庫(kù)執(zhí)行。默認(rèn)是空,表示不會(huì)強(qiáng)制更新數(shù)據(jù)庫(kù)。有幾個(gè)候選值:create或create-drop、update等。其中create表示每次只創(chuàng)建新增的;create-drop表示每次ISessionFactory創(chuàng)建時(shí)創(chuàng)建表 ,ISessionFactory關(guān)閉時(shí),刪除表;其中update表示每次都會(huì)將DDL SQL更新到數(shù)據(jù)庫(kù)中。(我記得有update,但文檔中沒(méi)有這個(gè)選項(xiàng))

“C#中NHibernate結(jié)構(gòu)是什么”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI