0

子コレクションを含む親が与えられた場合、次の属性があります。

[Include, Composition]
public virtual ICollection<FieldValue> FieldValues {get;set;}

とロードを行う:

Context.Load(Context.GetQuery(),LoadBehavior.RefreshCurrent,true);

別のユーザーまたはバックグラウンドプロセスによって削除されたFieldValuesは、クライアントコンテキストから削除されないことがわかります。これが設計上どのようになるかはわかりますが、これを回避するにはどうすればよいですか?削除されたアイテムを処理するためにロードプロセスにプラグインする方法はありますか?

ロードコールバックは、見た目では遅すぎます。すべてがすでにマージされているため、比較するものはありません。

4

1 に答える 1

1

理解した。親クラスが Root の場合、ロードを実行する方法は次のとおりです。

var originalValues = Context.EntityContainer
    .GetEntitySet<FieldValue>()
    .ToList(); // <-- make the pre-load copy of the child entities

Context.Load(Context.GetQuery(),
    LoadBehavior.RefreshCurrent,
    (LoadOperation<Root> o) =>
    {
        (from v in originalValues
        join nv in o.AllEntities.OfType<FieldValue>() on v equals nv into g
        from existing in g.DefaultIfEmpty()
        where existing == null
        select v)
        .ToList()
        .ForEach(Context.EntityContainer.GetEntitySet<FieldValue>().Detach);
    },
    null);

注: FieldValue は IEquatable<> を実装します。子がそうでない場合は PK を使用します。

于 2012-06-25T19:10:29.480 に答える