在我的域名中,我有这些课程(简化形式)
public class Document
{
public string Id { get; set; }
public IList<MetadataValue> MetadataList { get; set; }
}
public class MetadataValue
{
public string DocumentId { get; set; }
public string Metadata { get; set; }
public string Value { get; set; }
}
文档可能包含许多元数据。在Document实体的映射中我有:
HasMany<MetadataValue>(x => x.MetadataList)
.WithRequired()
.HasForeignKey(x => x.DocumentId);
当我持久化Document对象时,其元数据列表也会保持不变。但是当我检索Document对象时,其元数据列表始终为null。这种映射有什么问题?
答案 0 :(得分:5)
而不是让导航属性virtual
启用延迟加载 - 如Paige Cook所建议的那样 - 您也可以急切加载该集合:
var query = dbContext.Documents
.Where(d => d.Id == "MyDoc")
.Include(d => d.MetadataList);
如果您不使用延迟加载,则必须在查询中明确定义哪个导航属性 - 引用和集合 - 您希望与实体一起加载。
答案 1 :(得分:3)
您需要将Document类上的MetadataList属性声明为虚拟ICollection,以便EF可以正确映射它:
public virtual ICollection<MetadataValue> MetadataList { get; set; }
答案 2 :(得分:1)
最简单的方法是使用MetadataValueID作为密钥(而不是使用DocumentID)。