c# - 在实体上显式加载多个引用/集合

标签 c# entity-framework eager-loading

考虑以下实体模型:

public class Parent
{
    public virtual FirstChild FirstChild { get; set; }
    public virtual SecondChild SecondChild { get; set; }
}

在我的代码中,我加载了 Parent 实体:

Parent parent = <loaded in some way>;

为了显式加载它的导航属性,我使用了

db.Entry(parent).Reference(p => p.FirstChild).Load();
db.Entry(parent).Reference(p => p.SecondChild).Load();

但这会导致两个数据库查询。

问题:有没有一种更优雅的方式,允许在单个查询中显式加载多个导航属性?

如果我没有加载 parent,我会进行预先加载:

Parent parent = db.Parents
    .Include(p => p.FirstChild)
    .Include(p => p.SecondChild)
    .FirstOrDefault();

但是,正如我提到的,我已经在没有相关实体的情况下加载了它(而且我无法修改加载代码)。

最佳答案

唯一可能的方法 (afaik) 是重新加载父属性。假设变量 parent 附加到上下文:

var tmp = db.Parents
    .Include(p => p.FirstChild)
    .Include(p => p.SecondChild)
    .FirstOrDefault(p => p.Equals(parent));

// tmp and parent are the same instance now!
var isTrue = ReferenceEquals(tmp, parent);

var child1 = parent.FirstChild;  // is already loaded
var child2 = parent.SecondChild; // is already loaded

这行得通,因为上下文会检测到您要查找的实体已经加载并已附加,因此不会创建新实体而是更新旧实体(在本例中为 parent)。

关于c# - 在实体上显式加载多个引用/集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29013963/

相关文章:

c# - IParameterInspector .BeforeCall 中的引用类型字段为 null

c# - WF4工作流服务和 Entity Framework 问题

c# - 如何在不拉起任务栏的情况下启动新程序?

Asp.Net 身份 2.0 : The entity type User is not part of the model for the current context

php - Laravel:将动态范围与

c# - 纯 C# 编码的交易

c# - 从另一个列表更新列表 - Entity Framework

c# - DbContext 全局范围与方法级范围

laravel - 禁用热切关系

php - laravel Eloquent 急切加载嵌套条件