13

Aggregatesについて Entity Framework にどのように伝えることができますか?

  1. 集計を保存するときは、集計内のエンティティを保存します
  2. 集計を削除するときは、集計内のエンティティを削除します
  3. 2 人の異なるユーザーが同じ集計内の 2 つの異なるエンティティを変更しようとすると、同時実行エラーが発生します
  4. 集計をロードするときは、集計内のすべてのエンティティにアクセスする前に多少の遅延がある場合でも、集計の一貫したポイント イン タイム ビューを提供します。

(Entity Framework 4.3.1 Code First)

4

2 に答える 2

7

EF には、集計を定義して使用できる機能が用意されています。

  1. これが最も痛い部分です。EF はエンティティ グラフを操作します。Invoice のようなエンティティがあり、このエンティティに関連する InvoiceLine エンティティのコレクションがある場合、集計のようにアプローチできます。アタッチされたシナリオではすべてが期待どおりに機能しますが、デタッチされたシナリオ (集計が EF によって読み込まれていないか、別のコンテキスト インスタンスによって読み込まれている) では、集計をコンテキスト インスタンスにアタッチし、何を変更したかを正確に伝える必要があります = 状態を設定します。オブジェクトグラフ内のすべてのエンティティと独立した関連付け。
  2. これはカスケード削除によって処理されます。関連するエンティティが読み込まれている場合、EF はそれらを削除しますが、そうでない場合は、データベースのリレーションに対してカスケード削除を構成する必要があります。
  3. これは、データベースの同時実行トークンによって処理されます。最も一般的なのは、タイムスタンプ列または行バージョン列のいずれかです。
  4. 最初に熱心な読み込みを使用してすべてのデータを一緒に読み込む (= 一貫した視点) か、遅延読み込みを使用する必要があります。すでにロードした集計の他の部分は更新されません (EF でそのような更新を実装しようとすると、これはパフォーマンス キラーと見なされます)。
于 2012-06-16T16:41:51.070 に答える
6

私は特にこの目的のためにGraphDiffを書きました。流暢なマッピングを提供することで、更新時に「集約境界」を定義できます。切り離されたエンティティ グラフをやり取りする必要がある場合に使用しました。

例えば:

// Update method of repository
public void Update(Order order)
{
    context.UpdateGraph(order, map => map
        .OwnedCollection(p => p.OrderItems);
}

上記は、注文エンティティを更新し、OrderItems のコレクションもマージするように Entity Framework に指示します。この方法でのマッピングにより、Entity Framework が集計で定義した境界内のグラフのみを管理し、他のすべてのプロパティを無視することが保証されます。すべてのエンティティのオプティミスティック コンカレンシー チェックをサポートします。はるかに複雑なシナリオを処理し、多対多のシナリオで (AssociatedCollections を介して) 参照を更新することも処理できます。

これが役立つことを願っています。

于 2014-01-07T16:29:24.720 に答える