实体框架如何访问关联?

时间:2013-06-25 16:08:14

标签: c# linq entity-framework

我的Entity Framework模型中有两个表KittensOwnersKitten有1 OwnerOwner可以有Kitten个。{/ p>

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

由于我建立了一个关联,我可以kitten.Owner.Name

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

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

1 个答案:

答案 0 :(得分:2)

默认情况下,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();
}

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