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

4
在我的领域中,我有以下这些类(简化形式):
    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对象时,它的元数据列表总是为空。这个映射有什么问题吗?

3个回答

5

除了像Paige Cook所建议的使导航属性virtual以启用延迟加载之外,您还可以主动加载集合:

var query = dbContext.Documents
    .Where(d => d.Id == "MyDoc")
    .Include(d => d.MetadataList);

如果您不使用延迟加载,那么您必须在查询中明确指定要与实体一起加载的导航属性(引用和集合)。


我找不到 IQueryable 的 Include 方法。它在哪个命名空间中? - rovsen
@arch stantonпјҡйңҖиҰҒеј•з”ЁEntityFramework.dllпјҢ并еҢ…еҗ«using System.Data.Entity;е‘ҪеҗҚз©әй—ҙгҖӮ - Slauma

3
你需要将你的Document类上的MetadataList属性声明为虚拟ICollection,这样EF才能正确地映射它:
public virtual ICollection<MetadataValue> MetadataList { get; set; }

virtual е’Ң ICollection жҳҜйҖүйЎ№пјҢиҖҢдёҚжҳҜеҝ…иҰҒжқЎд»¶гҖӮ - Slauma

1

最简单的方法是使用MetadataValueID作为键(而不是使用DocumentID)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接