2

我需要设计具有两个简单实体的域:

public class User
{
    public virtual int Id { get; protected set; }
    public virtual string Email { get; protected set; }
    public virtual Country Country { get; protected set; }
    ...
}

public class Country
{
    public virtual int Id { get; protected set; }
    public virtual string Name { get; protected set; }
    ...
}

在域世界中一切都很好而且很清楚,但问题是 User 和 Country 在两个不同服务器上的两个不同数据库中持久存在(它们都是 MSSQL 2005 服务器)。

那么,我应该如何正确地在 NHibernate 中跨不同的 sql 服务器实现实体的持久性?

在引用中使用 ID 而不是对象?是的,这很简单,但它对整个域的影响很大,使域对象更像 DTO。并且它将要求 IUserRepository 掌握 ICountryRepository 以加载用户实体。

链接服务器?嗯...不知何故我不喜欢它(分布式事务和没有 XML 列)。在使用它们时我应该注意什么,更重要的是我应该如何配置 NHibernate 以有效地与链接服务器一起工作?

也许其他一些解决方案?

4

2 回答 2

0

您可以使用来自 NHContrib 的 NHibernate.Shards。

于 2012-06-09T05:54:01.760 回答
0

我听说有人schema在类映射中使用该属性来包含链接的服务器名称(如otherserver.dbo),但我不知道有谁在这样做时没有遇到一个或另一个问题。

有一些 DDD 引导框架允许您透明地将实体映射到不同的数据库(产生多个ISessionFactories,它将​​为您管理)。NCommon是我推荐的一种。然而,这假设Country它只存在于一个数据库中,并且User只存在于另一个数据库中。

至于事务...好吧,如果您使用TransactionScope并配置 DTS,那可能会起作用。NCommon 使用的UnitOfWorkAPI 也封装了TransactionScope.

您必须进行更改User,以便这Country只是一个 ID。这就是为什么。你最终会得到两个会话工厂,一个有一个映射,Country另一个有一个映射User。如果您不进行更改,NHibernate 将抱怨Country您保存时没有映射User(因为它们存储在两个不同的数据库中)。

现在你可以指示 NHibernate 忽略Country属性,并保持Country你的域不会改变。但是,User下次从数据库加载时,Country 将为空。

于 2012-06-09T05:59:45.917 回答