2

我有两个表,KittensOwners我的实体框架模型中。AKitten有 1 Owner,但 anOwner可以有多个Kittens。

我有一个名为GetKittens()返回的存储库方法_context.Kittens.ToList();

既然我成立了协会,我就可以做到kitten.Owner.Name

但是由于 ToList() 已经被调用,并且上下文已被处理,它如何访问该属性?检索实体时,它是否对所有具有关联的表进行联接?

我必须编写一个从 4 个表中提取数据的查询,所以我想知道如何有效地做到这一点,因此这个问题试图更多地了解 EF 的工作原理。

4

1 回答 1

2

默认情况下,aDbContext将使用延迟加载。根据您的用例,您可以使用一些选项。

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)),因为存储库已经返回列表。

如果这样做,请考虑在实现之前急切地将 Kitten 的所有者包含在存储库中,ToList()或者返回 IQuerable 并将责任留给调用类以包含相关实体或自定义查询。如果您不希望调用者能够更改查询,则可以添加带有包含的重载,可能类似于以下内容:

public List<Kitten> GetKittens(params string[] includes)
{
    return includes.Aggregate(
               context.Kittens.AsQueryable(), 
               (query, include) => return query.Include(include)).ToList();
}

总而言之,这是您必须做出的实施决策。

于 2013-06-25T16:49:09.247 回答