在实体框架中处理上下文之前更新整个图

本文关键字:更新 上下文 实体 框架 处理 | 更新日期: 2023-09-27 17:53:00

假设有两个简单的实体:

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 s,然后尝试迭代所有关系,CatRelation的另一端就在那里,但它的导航属性不起作用(context处置)。例如,给定下面的cat var cat1 = cats.First().ToRelations.First().ToCat,如果我尝试访问cat1.ToRelations,就会得到一个contextdispose异常。

那么,在处理上下文之前,是否有一种方法可以让上下文修复所有这些导航属性(因为我知道我已经加载了所有CatRelations的所有cat) ?

在实体框架中处理上下文之前更新整个图

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

在任何情况下,我不认为这是可能的EF拉数据嵌套任意深或可能有循环在他们的关系图。