我的实体框架模型中有两个表,分别为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()
实现之前急于在存储库中包含小猫的所有者,或者返回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/