2012-06-14 129 views
5

我有一個查詢表和我的數據庫中的數據表。我將以性別和人物爲例。所以我們可以說性別表看起來像這樣:實體框架代碼保存後首先不延遲加載

Id   Code 
1   Male 
2   Female 

和人表看起來像這樣:

Id   Name    GenderId 
1   Bob    1 
2   Jane    2 

我仿照EF代碼兩個表第一,像這樣:

public class Gender 
{ 
    public int Id {get;set;} 
    public string Code {get;set;} 
} 

public class Person 
{ 
    public int Id {get;set;} 
    public string Name {get;set;} 
    public int GenderId {get;set;} 

    public virtual Gender {get;set;} 
} 

如果我讀了一個已經在數據庫中的人,那麼我可以訪問person.Gender.Code而不會有任何問題。如果我這樣做:

var person = new Person 
      { 
       Name = "Bob", 
       GenderId = 1, 
      }; 

context.People.Add(person); 
context.SaveChanges(); 

var code = person.Gender.Code; 

然後,它會正確保存,但性別爲空的最後一行將失敗。如果我然後打開一個新的上下文並加載保存的實體,那麼最後一行工作正常。有沒有一種方法可以在保存後直接訪問性別,就像我剛剛從數據庫加載實體一樣?

+0

的最後一句話是未完成的,你能不能改正呢? –

+0

對不起,第一次沒有保存,當我回到頁面時,它一定不會裝載整個東西。 – VARAK

回答

8

你的問題是,當你使用new Person()它只會創建一個POCO對象,它不知道如何獲得它的Gender屬性。所以爲了使延遲加載工作,你需要proxies

您可以創建人與DbSet.Create()代理:

var person = context.People.Create(); 
person.Name = "Bob"; 
person.GenderId = 1; 

context.People.Add(person); 
context.SaveChanges(); 
+0

謝謝!第一段代碼運行良好。第二個將是可取的,但它沒有奏效。它似乎只是吐出沒有啓用延遲加載的人員的緩存版本。 – VARAK

+0

是啊看起來Find()不會返回一個代理......你可以用'context.People.Single(p => p.Id == person.Id)'來試試嗎? – nemesv

+0

'Single'也不起作用。但是,如果在'Find'或'Single'之前調用'context.People.Load();'它會將集合重新加載到上下文中。所以我認爲您應該使用'Create'來生成代理,刪除了我的答案的「查找」相關部分。 – nemesv