2

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; }
    ...
}

ドメインの世界ではすべてが明確ですが、問題は、ユーザーと国が2つの異なるサーバー上の2つの異なるデータベースに保持されていることです(両方ともMSSQL 2005サーバーです)。

では、NHibernate の異なる SQL サーバー間でエンティティの永続性を正しく実装するにはどうすればよいでしょうか?

参照でオブジェクトの代わりに ID を使用しますか? ええ、それは簡単ですが、ドメインオブジェクトをDTOのよ​​うにすることで、ドメイン全体に大きな打撃を与えています。また、Userエンティティをロードするには、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ただし、これはが 1 つのデータベースにUserのみ存在し、別のデータベースにのみ存在することを前提としています。

トランザクションに関しては...まあ、TransactionScopeDTS を使用して構成すると、うまくいくかもしれません。NCommon は、UnitOfWorkラップも行う API を使用しますTransactionScope

UserそれCountryが単なるIDになるように変更する必要があります。理由は次のとおりです。1 つは へのマッピングを持ち、もう 1 つは へのマッピングをCountry持ちUserます。その変更を行わないと、NHibernate は、Country保存時にマッピングがないと文句を言うでしょうUser(これらは 2 つの異なる DB に保存されているため)。

これで、 NHibernate にCountryプロパティを無視するように指示Countryし、ドメインが変更されないようにすることができます。ただし、User次回データベースからロードすると、Country は null になります。

于 2012-06-09T05:59:45.917 に答える