我在寫一個應用程序,用戶可以創建一個或多個存儲在數據庫中的「目錄」。但是,我想允許多種數據庫格式(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嗎?
這是正確的做法。每個數據庫類型一個會話工廠。另外考慮擴展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