2012-06-28 48 views
1

我的數據庫中有一個Person和Occupation表。當我創建一個人時,他們的默認OccupationId爲空。id更新後實體框架延遲加載

比方說,我創建了一個人,其ID是11。此外,還有一個職業,比方說,潛水員,它的編號是53,那麼我做到以下幾點:

using (var context = new DbEntities()) 
{ 
    person.OccupationId; //currently null 
    person.Occupation; //currently null 

    var person = context.People.First(x => x.Id == 11); 
    person.OccupationId=53; 
    context.SaveChanges(); 

    var occupation = person.Occupation.Description; //Exception: Occupation is null 
} 

的代碼失敗在最後一行,因爲職業最初是空的,並且新的職業沒有得到保存後的懶加載。如果這個人在運行這個代碼之前有一個職業,而舊的職業是懶惰加載的,那麼新的職業會在保存後出現。

換句話說,如果人有清潔工的職業第一那麼這將工作:

using (var context = new DbEntities()) 
{ 
    var person = context.People.First(x => x.Id == 11); 

    var occupation = person.Occupation.Description; //this would say Janitor 

    person.OccupationId=53; 
    context.SaveChanges(); 

    var occupation = person.Occupation.Description; //This would say Diver 
} 

有沒有辦法來延遲加載新職業後的保存,如果初始職業爲空?

回答

0

我結束了使用此:

if(person.Occupation==null && person.OccupationId!=null) 
    context.Entry(person).Reference(x=>x.Occupation).Load(); 

我敢肯定,有一種方法,使職業負載自動保存一次,但我沒有我的努力還沒有結束。

1

我不是對這個問題完全清楚,但這裏的鏡頭:

public class People 
{ 
    private Occupation occupation = null; 
    public Occupation Occupation 
    { 
     get { return this.GetOccupation(); } 
     set { this.occupation = value; } 
    } 

    private Occupation GetOccupation() 
    { 
     return this.GetOccupation(false); 
    } 

    private Occupation GetOccupation(bool force) 
    { 
     if(this.occupation == null || force) 
     { 
      using (var context = new DbEntities()) 
      { 
       this.occupation = context.Occupation.First(x => x.Id == this.OccupationId); 
      } 
     } 
     return this.occupation; 
    } 
} 

這裏的延遲加載與做力重載能力的一個簡單的例子。

在SaveChanges()中,您可以調用this.Occupation = null;下次有人訪問它時,它會延遲加載它。或者,你可以調用this.GetOccupation(true);這將強制重新加載佔領,但這有點挫敗延遲加載的目的。 (IE僅載入東西時,它的需要)

+0

看着你的編輯,如果'佔領'是空的,它會得到惰性加載應該沒關係......這就是延遲加載的全部要點。 – Metalstorm

+0

感謝您的回答。我想這會工作,但我想要的東西少 「哈克」 :) 我結束了使用此: 如果(!person.Occupation == NULL && person.OccupationId = NULL) context.Entry(人)。參照(X => x.Occupation).Load(); – VARAK

+0

我不會說我發佈的實現是'hacky',據我所知,這是很好的OO。 – Metalstorm