实体框架ObjectQuery.Include()

And*_*y E 6 c# entity-framework

我有一个对象有两个对象作为属性(User,PrimaryNode),两者都可能为null,见下文:

public class Item
{
    [Key]
    public int ItemId { get; set; }
    public string ItemName { get; set; }
    public Node PrimaryNode { get; set; }
    public User User { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我使用实体框架6填充Item对象并使用链包括填充PrimaryNodeUser对象中它.

当第一个链接的Include具有空对象时,整个对象将返回null,例如:

using (var db = new MyContext())
{
    var item = db.Items.Include(i => i.User).Include(n => n.PrimaryNode).FirstOrDefault(i => i.ItemId == id);
}
Run Code Online (Sandbox Code Playgroud)

如果在上面的示例中i.User为null,则该item变量为null.什么是填充子对象的最佳方式,如果子对象为null,那么父对象和另一个子对象仍然会被填充?

oct*_*ccl 1

我认为您的问题不是由Include电话引起的。根据文档

此扩展方法调用源对象的 Include(String)IQueryable方法(如果存在此类方法)。如果源 IQueryable没有匹配的方法,则该方法不执行任何操作

换句话说,将被翻译为:

 var item = db.Items.Include("User").Include("PrimaryNode").FirstOrDefault(i => i.ItemId == id);
Run Code Online (Sandbox Code Playgroud)

我的问题是,您确定您的id 与数据库中的Item现有行Users和表正确相关吗?当您最后PrimaryNodes调用方法时,将被转换为联接,因此如果您的关系的 FK 与引用的 PK 不匹配,您的查询不应返回您所期望的结果。Include

无论如何,如果您想尝试其他变体来加载相关属性,您可以使用显式加载

var item = db.Items.FirstOrDefault(i => i.ItemId == id);
context.Entry(item).Reference(p => p.PrimaryNode).Load(); 
context.Entry(item).Reference(p => p.User).Load();
Run Code Online (Sandbox Code Playgroud)