2010-09-15 101 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

相关问题