考虑以下实体模型:
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/