我的实体框架模型中有两个表,分别为KittensOwnersKitten具有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/

10-11 15:14