5

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

作为背景,我希望实现与此DBA.SE 帖子中描述的内容大致相似的东西。

4

2 回答 2

0

我在nhusers邮件列表上有一个有趣的答案。摘录如下:

来自杰森·梅克利

[...] 如果您谈论的是跨多个数据库存储单个实体,那么答案并不明确。您也许可以使用自定义用户类型和/或事件侦听器来处理对象,但这将是一团糟。

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

另一种选择是确定为什么有多个数据库。如果它们代表不同类型的数据/对象,则在域中明确表示。例如 CustomerWithAddress 是与 CustomerOrder 不同的实体。如果您需要来自两者的信息,则分别查询每个数据库并在代码中建立一个投影。

var x = session1.get(id);
var y = session2.get(id);
返回合并(x,y);

于 2011-03-10T15:49:43.380 回答
0

经过一番谷歌搜索(虽然我还没有尝试过),您显然至少可以将类映射到同一服务器上不同数据库中的表,使用

<class name="..." table="..." schema="database.schema">
  ...
</class>

在映射中。

但恕我直言,这是一个糟糕的解决方案,因为它似乎不是独立于服务器的。显然,NHibernate 只是在创建查询时将模式值与表值连接起来——而对于大多数服务器来说,“只是将数据库与模式一起放在其中”会产生一种语法,这种语法是 HAPPENS 工作的。但是您没有清楚地告诉 NHibernate“这是架构”和“这是数据库”,以便 NHibernate 可以清楚地决定如何构建查询 - 您通过在不属于的地方注入上下文数据来搞乱它的查询创建。

恕我直言,如果“模式”值包含 .

无论如何,似乎没有技术原因让您不能更进一步并使用 schema="server.database.schema",其中“server”是链接服务器的名称(例如参见http: //technet.microsoft.com/de-de/library/ms190479.aspx )

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

于 2013-12-13T10:54:25.387 回答