【问题标题】:How to use NHibernate with several databases and tables如何将 NHibernate 与多个数据库和表一起使用
【发布时间】:2012-09-25 19:34:44
【问题描述】:

我是 NHibernate 的新手,如果这是一个简单的问题,我深表歉意。基本上,我有一个包含对其他数据库的访问的数据库。这是我的基础数据库的布局。这是一个包含其他数据库的数据库信息的表

--Databases--
Id
DatabaseName
DatabaseType
ConnectionString

如您所见,此表包含所有维护的数据库。现在这是一个表,其中包含链接到数据库的所有列。

--Tables--
Id
Name
ColumnNames
DatabaseId

我有许多不同类型的数据库,包括(Oracle、mysql、mssql 或 postgresql)。它们在我的应用程序中都扮演着不同的角色。为每个数据库中的每个表创建映射 xml 文件将非常耗时。

我想传递 nhibernate 连接字符串并对表执行一个简单的查询。这是一个查询示例。

select * from table90182763 where id IS not NULL and id <> 0

我可以将这个 SQL 查询直接传递给 NHibernate 吗? 我可以在每个请求上有效地将连接字符串传递给休眠吗?

【问题讨论】:

  • 为什么需要对象关系映射器?我看不出它对您有多大用处,因为您的设置过于复杂。在你的情况下,在我看来它只会给你带来更多的痛苦而不是帮助你。如果您只想让抽象层抽象出不同的 DBMS,那么是的,您可以使用它。但是,解决方案不会比您实现自己的抽象更简单。您必须为您连接到的每个数据库配置一个新的 SessionFactory(您可以为此使用 FluentNHibernate,因此您可以动态配置 SessionFactories)。

标签: c# nhibernate


【解决方案1】:

您可以使用 session.CreateSQLQuery(),但它在您的场景中有一个缺点。

为了使用 CreateSQLQuery,您需要为每个数据库创建一个会话管理器,为要从结果构建的域实体映射文件和类,等等...

NHibernate 映射到实体,因此如果您想编写原始 SQL 并返回结果数据表,只需使用标准 ODBC 驱动程序并以旧方式处理即可。

NHibernate 使开发和维护变得更快、更容易,如果您将来想要快速维护和添加新功能,应该正确使用它。

正如强大的 Craig Quillen 所说:“如果它是合法的基础设施,并且可以为您节省时间和不眠之夜,那么它就是一个很好的投资回报率”。

您可以设置 NHibernate 以使用任意数量的数据库引擎类型访问任意数量的数据库。您还可以使用 IoC 容器抽象您的数据库会话,使其几乎透明。

您应该使用代码配置 (example here) 创建多个会话工厂,每个工厂都有自己的 ConnectionString、方言和驱动程序。这些将被创建为静态或“按需 IoC”单例。然后根据您需要加载的实体,您的 IoC 工厂可以从正确的 NHibernate 会话工厂请求会话。

为了直接从数据库表中以自动方式生成映射文件和实体,请使用类似于以下内容的工具: http://nmg.codeplex.com/

【讨论】:

  • “无意冒犯,但你的工作很草率”——是的,我相信他不会因此而生气......
  • 哇..谢谢你的解释。读完之后,我不认为 N​​Hibernate 会很好,因为表和数据库是动态创建的,而且我认为这不太合适,因为我需要为每个数据库设置一个会话管理器。我有很多动态查询,想使用 nhibernate 来减轻执行动态查询的痛苦。
猜你喜欢
  • 2014-03-20
  • 2016-11-12
  • 1970-01-01
  • 2021-04-06
  • 2015-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-28
相关资源
最近更新 更多