2011-03-20 31 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