我正在使用實體框架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
謝謝你的回答。我遇到的問題是,我不想在用戶點擊取消後丟棄所有對象,因爲我有從重負載的相同上下文加載的選項列表項。你可能會建議「從單獨的上下文中加載它們」,問題在於,當我編輯的對象從不同的上下文中引用這些選擇列表對象,並且我嘗試保存時,我會遇到麻煩。我猜沒有什麼可以做的,這是實體框架的一個缺點。 – user668032 2011-03-29 20:32:46
是的,你不能跨越上下文引用。它總是拋出異常。我通常建議克隆對象。保持主要不變的數據並克隆它們以便進行編輯。你也可以嘗試用選擇列表來做到這一點。 – 2011-03-29 21:23:04