我有形成树关系的实体。
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
我对生成的代理感到厌烦并注意到覆盖集合是代理类型的哈希集。它们不会被EntityCollection<TEntity>
EF 4 ObjectContext proxies支持。
我找到了答案here DbContext不会生成修复关系的代理。
答案 0 :(得分:1)
DbContext 不会生成修复关系的代理。
然而,当权利被附加到上下文加载相关实体时:
context.ASet.ToList();
context.BSet.ToList();
自动设置关系。
答案 1 :(得分:0)
我不确定这与跟踪有什么关系,但为了使关系正常工作,您需要将集合导航属性与它正在使用的密钥相关联。有关示例,请参阅here。