1

私はNHibernate(そして率直に言ってDDDの概念)に慣れていないので、私の質問は単純または無関係かもしれませんが、誰かが私の混乱を助けてくれれば非常にありがたいです。

私のアプリケーションでは、DDDとNHibernateをORMとして使用しています。

単純なエンティティでは問題なく動作しますが、現在、エンティティが非常に複雑になっている段階にあります(したがって、エンティティAにはエンティティBとエンティティCの配列が含まれ、各エンティティCにはDと他のいくつかのパラメータが含まれます... )。

私のクライアントアプリはインターネット経由でWCFサービス(dbと通信)と通信しているため、速度(およびペイロードサイズが非常に重要)です。場合によっては、これらの複雑なDTOの配列をサービスからクライアントに送信する必要があります。その後、クライアントはAのいくつかの値を更新し、保存/更新のためにサーバーに送り返します。

ペイロードを減らすために、サービスからクライアントにデータを送信するときに、マッパーで未使用のプロパティ値を無効にして(オートマッパーなどを使用していない)、DTOのBエンティティとCエンティティから未使用のプロパティ値を削除しようとしています。

エンティティをdbに保存する場合、どうすればよいですか?(マッパーで手動で無効にした)BとCのいくつかの変数にnull値を持つエンティティAを返すと、NHibernateはAを保存するときにBとCも保存しようとします。Aだけを保存したいのですが、 NHibernateにBまたはCから何も保存しないように依頼します。

どんな助けでも、私に祝福を与えるでしょう。

よろしくお願いします、D

4

2 に答える 2

1

この場合の解決策は、予測で見つけることができます。一言で言えば:

  • マッピングを正しく複雑に保ちます。
  • ただし、データを選択するときは、必要な列のみをselect句に入れてください。

そして、これはを介して行うことができますProjections。素敵な詳細な説明はここにあります:

http://shareyour-experience.blogspot.cz/2011/07/exploring-nhibernate-projections-and.html

ドキュメンテーション:

http://nhibernate.info/doc/nh/en/index.html#querycriteria-projection

データがサーバーに戻ると、完全にマップされたエンティティはすべてのプロパティを永続化できるようになります。

于 2012-11-19T05:27:24.860 に答える
0

エンティティが複雑になったら、エンティティの動作を呼び出すコマンドの概念をエンティティ自体の構造から切り離すのが最善です。(この場合のコマンドとは、操作を実行する要求を表すDTOを意味します)。次のようなコマンドを使用できます。

class DoSomethingToAnEntityCommand
{
  public string EntityId { get; set; }
  public int SomeValue { get; set; }
}

アプリケーションサービスがこのコマンドを処理すると、必要なエンティティが読み込まれ、そのエンティティで適用可能な動作が呼び出され、トランザクションがコミットされます。

次のステップは、クエリをコマンドから切り離すことです。DTOとして返されるデータベースからエンティティを取得する場合、対象となるエンティティをロードする場合と同じ取得メカニズムを使用する必要はありません。ご指摘のとおり、クエリ要件は単一のエンティティでも異なる場合があります。一部のクエリはエンティティの一部のみを必要とし、エンティティ全体をロードするにはコストがかかりすぎる可能性があります。エンティティの一部のみをロードするさまざまな方法があります。RadimKöhlerが述べているように、NHibernateプロジェクションを使用できます。もう1つのオプションは、NHibernateの外部でSQLクエリを直接使用することです。どちらのオプションでも、返されるオブジェクトは永続化されることを意図しておらず、クエリ要件を満たすためにのみ使用されます。

エンティティでビヘイビアーを呼び出す必要がある場合、エンティティを表すオブジェクトグラフ全体を渡す必要はありません。コードサンプルに示されているように、適切なエンティティのIDと、特定の操作を実行するために必要な引数を渡すだけで済みます。ここでNHibernateが登場します。これは、IDによってエンティティをロードし、操作中に行われた変更を追跡して、データベースに永続的に戻すことができます。

于 2012-11-19T18:32:34.473 に答える