在Entity Framework中处理上下文之前更新整个图

时间:2015-06-02 12:57:30

标签: c# entity-framework

假设我有两个简单的实体:

class Cat
{
    int Id;
    string Name;
    ICollection<CatRelation> ToRelations;
    ICollection<CatRelation> FromRelations;
}
class CatRelation
{
    int FromCatId;
    int ToCatId;
    Cat FromCat;
    Cat ToCat;
    string RelationType;
}

我想要做的是加载所有Cat及其关系,并让导航属性在整个图表中起作用。到目前为止,我有这样的事情:

context.Cats.Include(cat => cat.ToRelations)
            .Include(cat => cat.FromRelations)
            .ToList()

在此之后处理上下文。在该行的下方,迭代列表。这适用于进入关系实体,但是如果我,例如,迭代Cat然后尝试迭代所有关系,CatRelation的另一端就在那里,但它的导航属性不起作用(ContextDisposed)。在给定以下cat var cat1 = cats.First().ToRelations.First().ToCat的情况下,如果我尝试访问cat1.ToRelations,我会得到ContextDisposed -exception。

在处理上下文之前,有没有办法要求上下文修复所有这些导航属性(因为我知道我已经加载了所有CatRelations的所有Cats)?

1 个答案:

答案 0 :(得分:0)

对于图表,我认为最好加载整个表,然后自己构建图表。即使你可以让EF递归地从数据库中提取所有数据,它也不会重用现有对象的关系(如果它们存在于内存中),而是构建具有相同数据的新实例。这可能不是你想要的,它会导致更多的数据传输到启动。

在任何情况下,我都不认为有可能让EF提取任意深度嵌套的数据,或者可能在关系图中有周期。