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对象并使用链包括填充PrimaryNode和User对象中它.
当第一个链接的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,那么父对象和另一个子对象仍然会被填充?
我认为您的问题不是由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)