使用最新版本的NHibernate(可能还有一些插件),可以在不使用DB链接的情况下在不同服务器上的多个数据库中映射实体吗?
对于背景,我希望实现与此DBA.SE post中描述的内容类似的东西。
答案 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)
除了那些肮脏的黑客外,每个人似乎都建议使用多个会话工厂。