4

ツリー関係を形成するエンティティがあります。

class MyEntity
{
    public int Id {get;set;}

    public int ParentId {get;set;}
    public virtual MyEntity Parent {get;set;}

    public virtual ICollection<MyEntity> Children {get;set;}
}

これらのエンティティがリレーションシップなし AsNoTracking()で呼び出されると、修正されます。

var entities = MyEntitiesSet.ToList();

すべてのナビゲーション プロパティとコレクションが設定されます。
ただし、AsNoTracking()呼び出された場合:

var entities = MyEntitiesSet.AsNoTracking.ToList();

ナビゲーション プロパティは設定されていません。これは理解できます。しかし、このコードの関係修正を提供するために、コレクションとナビゲーションのプロパティがオーバーライドされない理由がわかりません。

entity.Parent = anotherEntity;

anotherEntity.Childrenここで、コレクションにエンティティが含まれるようになったことを期待しています。残念ながら、私の実験が示すように、これは誤った期待です。

変更の追跡を有効にせずに、望ましい動作を得ることができますか?

更新 1

私は生成されたプロキシを見て、オーバーライドされたコレクションがプロキシ タイプのハッシュセットであることを指摘しました。それらは、 EF 4 ObjectContext プロキシEntityCollection<TEntity>に当てはまったものによってバックアップされません。

そして、私はここで答えを見つけました。
DbContext は、関係を修正するプロキシを生成しません。

4

2 に答える 2

2

DbContextは、関係を修正するプロキシを生成しません。

証明はこちら: http://connect.microsoft.com/VisualStudio/feedback/details/760609/poco-navigation-proxies-should-fixup-the-other-end-automatically

それでも、エンティティが関連するエンティティをロードするコンテキストにアタッチされている場合:

context.ASet.ToList();
context.BSet.ToList();

関係を自動的に設定します。

于 2013-08-16T09:34:02.347 に答える
0

これが追跡とどのように関係しているかはわかりませんが、関係を機能させるには、コレクションのナビゲーション プロパティを使用しているキーに関連付ける必要があります。例については、こちらを参照してください。

于 2013-08-16T02:26:45.700 に答える