我正在使用 Entity Framework 4.0 POCO 和 WPF。 我有一个表单向用户显示一个具有多对多关系的对象,如下所示:
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 对象时,他/她可以单击“保存”或“取消”。问题是,当用户单击“取消”时,我需要告诉 Entity Framework 还原所有更改。
任何处理此问题的方法都非常受欢迎,包括重新加载。
这是我尝试过的:
1. 丢弃 objectContext,创建一个新的对象上下文,然后查询数据库以重新加载所有内容。这里的问题是 Entity Framework 缓存了一些东西并且旧对象附加到旧上下文并且如果用户单击取消然后再次编辑并单击保存我会得到异常。
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·米捷夫
最佳答案
EF 不提供丢弃更改。 EF 也没有二级缓存,因此一旦您使用更改处理上下文并创建新上下文以从数据库加载数据,您将获得未更改的数据。
The problem here is that Entity Framework caches things and old objects linger attached to the old context and I get exceptions if the user clicks cancel then edits again and clicks save.
当用户点击取消时,您必须丢弃编辑中使用的所有对象及其上下文。这些对象和上下文都死了。一旦用户再次点击编辑,您必须再次从数据库加载所有内容。
刷新导航属性效果不佳。例如,一旦您将某些内容添加到导航集合中,它将永远不会通过从数据库中刷新来删除。
关于entity-framework-4 - 使用 Entity Framework 4 POCO 放弃更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5367313/