NHibernate:在没有DB链接的不同服务器上跨多个DB映射实体

时间:2011-03-09 13:08:14

标签: .net nhibernate nhibernate-mapping multiple-databases

使用最新版本的NHibernate(可能还有一些插件),可以在不使用DB链接的情况下在不同服务器上的多个数据库中映射实体吗?

对于背景,我希望实现与此DBA.SE post中描述的内容类似的东西。

2 个答案:

答案 0 :(得分:0)

我在 nhusers 邮件列表上有 interesting answer 。摘录如下:

  

来自Jason Meckley

     

[...]如果你在谈论存储   跨多个的单个实体   数据库,答案并不干净。   你可能能够做点什么   自定义用户类型和/或事件   听众用水化物体,但是   这将是一个混乱的维护。

     

另一种方法是转移   使用的数据从一个数据库到另一个数据库   ETL过程。相近   复制,但只转移   其他数据库所需的数据。   你最终得到1个可写数据库   和许多读数据库。然后你映射   域到单个数据库。

     

另一种选择是确定原因   有多个数据库。如果他们   代表不同类型的   数据/对象然后明确表达   在域中。例如   CustomerWithAddress是一个不同的   实体比CustomerOrder。如果你需要   来自两者的信息,然后查询每个   数据库单独建立一个   在代码中投影。

     

var x =   session1.get(ID);
  var y =   session2.get(ID);
  return merge(x,y);

答案 1 :(得分:0)

经过一些googeling(虽然我还没有尝试过),你显然至少可以使用

将类映射到同一服务器上不同数据库中的表
<class name="..." table="..." schema="database.schema">
  ...
</class>

在映射中。

但恕我直言,这是一个糟糕的解决方案,因为它似乎不是与服务器无关的。显然,NHibernate只是在创建查询时将模式值与表值连接起来 - 对于大多数服务器来说,“只需将数据库放在那里使用模式”就会产生HAPPENS工作的语法。但是你没有干净地告诉NHibernate“这是架构”和“这是数据库”,这样NHibernate可以干净地决定如何构建查询 - 你通过注入不属于它的上下文数据来搞乱它的查询创建。

恕我直言,如果“架构”值包含一个,那么NHibernate应该抑制这种肮脏的黑客并抛出异常。

无论如何,似乎没有技术上的理由说明为什么你不能更进一步并使用schema =“server.database.schema”,其中“server”是链接服务器的名称(参见参考资料)例如http://technet.microsoft.com/de-de/library/ms190479.aspx

除了那些肮脏的黑客外,每个人似乎都建议使用多个会话工厂。