2011-03-09 79 views
5

使用最新版本的NHibernate(可能包括一些插件),可以将实体映射到不同服务器上的多个数据库而无需DB链接?NHibernate:跨不同服务器上的多个数据库映射实体而不使用数据库链接

对于背景,我正在寻找实施与此DBA.SE post中描述的内容大致相似的内容。

+0

这是一样的分片? – 2011-03-09 14:13:23

+0

@Jason:分片基本上是关于数据划分/复制。就我而言,我需要对异构数据存储的统一视图。 – 2011-03-09 14:18:13

回答

0

我有一个interesting answernhusers邮件列表。摘译如下:

从贾森Meckley

[...]如果你是在谈论存储 一个单一的实体跨越多个 数据库,答案是不干净。 您可能可以通过 自定义用户类型和/或事件 侦听器来保护对象,但 这可能是一团糟维护。

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

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

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

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

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

相关问题