2011-03-20 61 views
3

我正在使用實體框架4.0 POCO與WPF。 我必須向用戶顯示有許多的目的是一對多的關係如下所示的形式:使用實體框架4放棄更改POCO

public class BPartner : BaseEntity 
{ 
    public string Name 
    { 
     get { return name; } 
     set 
     { 
      if (name != value) 
      { 
       name = bpartnerValidatorLight.ValidateName(value); 
       OnPropertyChanged("Name",true); 
      } 
     } 
    } 
    public virtual ObservableCollection<BPAddress> BPAddresses { get; set; } 

} 

public class BPAddress : BaseEntity 
{ 
    public string Line1 
    { 
     get 
     { 
      return line1; 
     } 
     set 
     { 
      if (line1 != value) 
      { 
       line1 = bpAddressValidatorLight.ValidateLine1(value); 
       OnPropertyChanged("Line1",true); 
      } 
     } 
    } 

    public virtual City City 
    { 
     get { return city; } 
     set 
     { 
      if (city != value) 
      { 
       city = value; 
       OnPropertyChanged("City"); 
      } 
     } 
    } 
} 

用戶可以添加和BPAddresses集合中刪除地址並更改了BPartner的「名稱」。當用戶完成修改BPArtner對象時,他/她可以單擊「保存」或「取消」。問題是,當用戶點擊「取消」時,我需要告訴實體框架恢復所有更改。 處理此問題的任何方法都非常受歡迎,包括重新加載。 以下是我曾嘗試過的: 1.放棄objectContext,創建一個新的對象上下文並只查詢數據庫以重新載入所有內容。這裏的問題是實體框架緩存事物和舊對象連接到舊的上下文,並且如果用戶單擊取消然後再次編輯並單擊保存,我會得到異常。 2.
repoBPartner.Refresh(bp);

 IQueryable<BPAddress> query = from e in addressRepo.AsQueryable() 

       where e.BPartnerId == bp.Id 
       select e; 
     ObjectQuery<BPAddress> objectQuery = (ObjectQuery<BPAddress>)query; 
     objectQuery.Include("City"); 
     objectQuery.Include("Country"); 
      ObjectResult<BPAddress> result = (ObjectResult<BPAddress>)objectQuery.Execute(MergeOption.OverwriteChanges); 
     bp.BPAddresses = new System.Collections.ObjectModel.ObservableCollection<BPAddress>(result.ToList<BPAddress>()); 

     The problem here is that "City" property does not get refreshed. 
3. Tried: objectContext.LoadProperty(bp, "BPAddresses", MergeOption.OverwriteChanges); 

以上都是部分工作。實現這一目標的最佳做法是什麼?

任何幫助將不勝感激。

感謝, K. Mitev

回答

2

EF不提供丟棄的變化。 EF也沒有二級緩存,所以一旦你處理一個帶有變化的上下文,並創建一個新的上下文來從數據庫加載數據,你將得到不變的數據。

的這裏的問題是,實體 框架緩存一些東西,老 對象縈繞裝在舊 背景下,我得到異常,如果 用戶點擊取消,然後再編輯 和點擊保存。

當用戶單擊取消時,您必須丟棄所有用於創建的對象及其上下文。這些對象和上下文都是死的。一旦用戶再次單擊編輯,您必須再次從數據庫加載所有內容。

刷新導航屬性不起作用。例如,一旦你添加了一些東西導航收藏它永遠不會被從數據庫刷新刪除。

+0

謝謝你的回答。我遇到的問題是,我不想在用戶點擊取消後丟棄所有對象,因爲我有從重負載的相同上下文加載的選項列表項。你可能會建議「從單獨的上下文中加載它們」,問題在於,當我編輯的對象從不同的上下文中引用這些選擇列表對象,並且我嘗試保存時,我會遇到麻煩。我猜沒有什麼可以做的,這是實體框架的一個缺點。 – user668032 2011-03-29 20:32:46

+0

是的,你不能跨越上下文引用。它總是拋出異常。我通常建議克隆對象。保持主要不變的數據並克隆它們以便進行編輯。你也可以嘗試用選擇列表來做到這一點。 – 2011-03-29 21:23:04