我的 Entity Framework 模型中有两个表:Kittens
和 Owners
。一只 Kitten
有 1 个 Owner
,但一个 Owner
可以拥有许多 Kitten
。
我有一个名为 GetKittens()
的存储库方法,它返回 _context.Kittens.ToList();
既然我建立了关联,我就可以做kitten.Owner.Name
。
但是由于 ToList() 已经被调用,并且上下文已被释放,那么它如何访问该属性呢?检索实体时,它是否对具有关联的所有表进行联接?
我必须编写一个从 4 个表中提取数据的查询,所以我想知道如何有效地执行此操作,因此这个问题试图更多地了解 EF 的工作原理。
最佳答案
默认情况下,DbContext
将使用延迟加载。根据您的用例,您可以使用一些选项。
1- 如果您可以控制 DbContext
的生命周期,请勿丢弃。但是,每次您访问相关实体(第一次)时,都会向数据库发送一个新查询以获取它。
2- 急切地通过使用 Include
包含相关实体关于IQueryable<Kitten>
:
// For imagine context is the DbContext for your EF Model
context.Kittens.Include(c => c.Owners); // Or Include("Owners")
但是,如果您无法控制存储库,则您别无选择,只能调用存储库的相关方法(例如 IEnumerable<Owner> GetOwners(Kitten kitten)
),因为存储库已经返回列表。
如果您这样做,请考虑在使用 ToList()
实现之前急切地将 Kitten 的所有者包含在存储库中或返回 IQuerable 并将责任留给调用类以包含相关实体或自定义查询。如果您不希望调用者能够更改查询,则可以添加包含的重载,该重载可能类似于:
public List<Kitten> GetKittens(params string[] includes)
{
return includes.Aggregate(
context.Kittens.AsQueryable(),
(query, include) => return query.Include(include)).ToList();
}
总而言之,这是您必须做出的实现决定。
关于c# - Entity Framework 如何访问关联?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17302251/