2010-09-15 109 views
1

我在寫一個應用程序,用戶可以創建一個或多個存儲在數據庫中的「目錄」。但是,我想允許多種數據庫格式(SQL Server和SQL Lite),並且我希望用戶能夠同時在應用程序中打開多個目錄。目錄數據庫的位置在運行時纔會知道。因此,我不希望任何特定的數據庫設置存儲在應用程序的配置中。使用NHibernate連接到不同類型的多個數據庫

我剛剛開始使用NHibernate,但我打算爲所有與目錄相關的類創建NHibernate映射。我試圖弄清楚最好的設計模式,以允許我同時使用這一套映射與多個數據庫。

我想我可以省略指向特定數據庫和提供者的項目中的hibernate.cfg.xml文件,而只是將映射(.hbm.xml)文件構建到我的程序集中。這是正確的嗎?

然後當我的應用程序運行時,我從程序集創建一個NHibernate配置,它只包含映射信息而不包含任何特定的提供程序/數據庫信息。從這個配置我會創建一個單一的ISessionFactory

然後當用戶想要打開一個目錄時,我會創建一個ADO.NET IDbConnection到他們用正確的提供程序指定的數據庫。然後訪問數據庫,我會將該特定連接傳遞給單個SessionFactory的OpenSession()方法。

ISession session = sessionfactory.OpenSession(IDbConnection conn); 

我在正確的軌道上嗎?我會描述一下工作,還是有更好的方法?


更新

現在,我已經做了一些更多的閱讀,我不認爲這會工作。一個ISessionFactory被配置爲一個特定的方言/驅動程序等。因此,當一個ISessionFactory可以在多個IDBConnections之間切換時,這些連接需要到同一類型的數據庫。由於ISessionFactory是不可變的,因此無法在支持一種類型的數據庫和另一種類型的數據庫之間切換實例。它是否正確?我應該爲每種我想支持的數據庫創建indussion個ISessionFactories嗎?

+0

這是正確的做法。每個數據庫類型一個會話工廠。另外考慮擴展NHibernate.Connection.IConnectionProvider以避免傳遞ado.net連接。考慮以下鏈接http://knol.google.com/k/fabio-maulo/nhibernate-chapter-2-architecture/1nr4enxv3dpeq/6#2(2E)3(2E)(C2)(A0)Contextual_Sessions for contextual sessions。 – Fahad 2010-09-16 22:53:24

回答

0

這是我做的:

你需要兩樣東西 - 存儲在一個字典多個會話工廠,抽象的,然後另一層訪問基於代碼的會話工廠。

根據數據庫的不同,每個會話工廠的配置都會有所不同。

您的應用程序代碼可能看起來是這樣的:

var session = NHibernateSessionManager.OpenSession(factoryCode: "SqlLiteSessionFactory"); 

我發現這是一個有用的模式,因爲他們通常原因共享映射,但具有不同的會話出廠配置:例如您可以針對異步記錄或批處理操作以不同的方式配置工廠;你可以使用不同的數據庫登錄等。使用這種模式,你也可以爲同一個實體使用不同的映射 - 例如,可能特定的用戶需要通過視圖訪問一個實體。

+0

可以或應該兩個相同類型的數據庫共享同一個SessionFactory。假設我有兩個SqlLite數據庫和兩個SQL Server數據庫。我需要4個會話工廠嗎?或者我可以用2個工廠嗎? – 2010-09-16 05:56:45

+0

我很想看看這個代碼... – rebelliard 2010-09-16 13:15:58

相關問題