2012-04-29 79 views
2

我一直沒能找到別人這個問題,所以在這裏。EF代碼第一個相關實體根本不加載

我有一個簡單的模型,其中一個實體簡單地引用其他如父子或一個一對多的關係是這樣定義的:

public class Parent 
{ 
    public int ID { get; private set; } 
    public string Name { get; private set; } 
} 

public class Child 
{ 
    public int ID { get; private set; } 
    public string Name { get; private set; } 
    public virtual Parent Parent { get; private set; } 
} 

我創建每個speicific映射文件,其工作的偉大除相關實體外的所有常規屬性。它始終是空的。無論我是否擁有屬性上的虛擬/私人訪問器,它都不會加載,除非我先從上下文中單獨提取父級副本。我的映射如下所示:

HasRequired(t => t.Parent).WithMany().Map(t => t.MapKey("ParentID")).WillCascadeOnDelete(); 

有什麼我在做這個錯嗎?我不能爲我的生活弄清楚這一點。只是讓我涵蓋所有的基礎,我加載實體是這樣的:

Context.Set<Child>().FirstOrDefault(x => x.ID == 1); 

而且最後這裏有一些限制,我有:

  1. 我不能在我的模型作爲屬性的外鍵。
  2. 我不能從父母那兒收集孩子。
+1

爲我工作。孩子被查詢加載,child.Parent在第一次訪問時被懶惰地加載。 – 2012-04-29 05:11:12

+0

爲什麼你有兩個班代表孩子和家長。因爲他們有相同的屬性 – 2012-04-29 05:27:53

+0

@Jayantha也許這只是示例代碼... – 2012-04-29 10:10:44

回答

0

可能是你還沒有啓用延遲加載。嘗試這個,

Context.Set<Child>().FirstOrDefault(x => x.ID == 1).Include(c=>c.Parent); 
+0

這似乎工作,但我無法弄清楚爲什麼懶加載沒有啓用。我離開了屬性的虛擬部分,甚至確保我在上下文中將它指定爲啓用:Configuration.LazyLoadingEnabled = true; – Jason 2012-04-29 14:51:00

+0

要啓用延遲加載,您需要具有虛擬屬性並需要啓用代理創建。 – 2012-04-29 15:51:52

+0

做到了這一點,但它沒有奏效。它原來是無參數的構造函數,請參閱上面的答案。 – Jason 2012-04-30 02:09:30

4

我終於想通了。經過多次試驗和錯誤之後,我注意到有一個無參數構造函數標記爲內部,EF無法創建其類型的動態代理類,因此禁用所有延遲加載。我有兩個構造函數,一個用於EF來保存對象,另一個用參數要求調用者創建我的實體。一旦我將簽名更改爲受保護的內部,它就開始工作。所以我改變了這一點:

internal Child() {} 

protected internal Child() {} 
+0

然後你在這裏放了一個不同的代碼:)。 PLZ更新你的問題。 – 2012-04-30 03:48:29

+0

認真...張貼真實的代碼是獲得答案的關鍵,許多讀這個問題會立即發現,並給你一個答案,如果你把它包括在問題中。 – TCC 2015-06-19 15:24:11