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 回答