EF 4.1代码优先:一对多映射问题

时间:2011-04-13 15:11:54

标签: entity-framework code-first one-to-many entity-framework-4.1

在我的域名中,我有这些课程(简化形式)

    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。这种映射有什么问题?

3 个答案:

答案 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)。