ツリー関係を形成するエンティティがあります。
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 は、関係を修正するプロキシを生成しません。