4

以我域我有這些類(以簡化的形式)EF 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; } 
    } 

文件可以具有許多元數據。在文檔實體映射中,我有:

HasMany<MetadataValue>(x => x.MetadataList) 
     .WithRequired() 
     .HasForeignKey(x => x.DocumentId); 

當我堅持Document對象時,它的元數據列表也被持久化。但是當我檢索Document對象時,其元數據列表始終爲空。這個映射有什麼問題?

回答

5

代替把導航屬性virtual,使延遲加載 - 提議佩奇庫克 - 你可以也渴望負荷集合:

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

如果你不使用延遲加載,你總是要在查詢其導航屬性明確地定義 - 引用和集合 - 你要到L與你的實體一起加入。

+0

我找不到IQueryable的Inlude方法。包含哪些名稱空間? – rovsen 2011-04-14 11:20:29

+0

@arch stanton:引用EntityFramework.dll是必要的,使用System.Data.Entity作爲包含的命名空間。 – Slauma 2011-04-14 13:13:52

+0

太好了,非常感謝 – rovsen 2011-04-14 13:29:25

3

你需要在你的文檔類中聲明你的元數據列表屬性作爲一個虛擬的ICollection使EF能正確映射它:

public virtual ICollection<MetadataValue> MetadataList { get; set; } 
+0

'virtual'和'ICollection'是*選項*,沒有必要的要求。 – Slauma 2011-04-13 15:42:30

+0

感謝佩奇,我需要它禁用懶惰加載。 – rovsen 2011-04-14 13:30:12

1

最簡單的方法是使用MetadataValueID作爲關鍵字(而不是使用DocumentID)。