Entity framework 4 放弃实体框架4 POCO的更改

Entity framework 4 放弃实体框架4 POCO的更改,entity-framework-4,poco,Entity Framework 4,Poco,我正在使用实体框架4.0POCO和WPF。 我有一个表单向用户显示一个具有多对多关系的对象,如下所示: public class BPartner : BaseEntity { public string Name { get { return name; } set { if (name != value) { name = bpartne

我正在使用实体框架4.0POCO和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"); 
            } 
        } 
    }
}
公共类BPartner:BaseEntity
{
公共字符串名
{ 
获取{返回名称;}
设置
{ 
如果(名称!=值)
{
name=bpartnerValidatorLight.ValidateName(值);
OnPropertyChanged(“名称”,真实);
} 
} 
}
公共虚拟可观察集合地址{get;set;}
}
公共类BPAddress:BaseEntity
{
公共字符串行1
{ 
得到
{ 
回流线1;
} 
设置
{ 
如果(第1行!=值)
{
line1=bpAddressValidatorLight.ValidateLine1(值);
OnPropertyChanged(“第1行”,真);
} 
} 
}
公共虚拟城市
{ 
获取{返回城市;}
设置
{ 
如果(城市!=值)
{
城市=价值;
不动产变更(“城市”);
} 
} 
}
}
用户可以在BPAddresses集合中添加和删除地址,并更改BPartner的“名称”。用户修改完BPArtner对象后,可以单击“保存”或“取消”。问题是,当用户单击“取消”时,我需要告诉实体框架恢复所有更改。 任何处理此问题的方法都是非常受欢迎的,包括重新加载。 以下是我尝试过的: 1.放弃objectContext,创建一个新的对象上下文,只需查询数据库即可重新加载所有内容。这里的问题是Entity Framework缓存了附着到旧上下文的内容和旧对象,如果用户单击“取消”,然后再次编辑并单击“保存”,则会出现异常。 2.
repoBPartner.Refresh(bp)

IQueryable query=来自addressRepo.AsQueryable()中的e
其中e.BPartnerId==bp.Id
选择e;
ObjectQuery ObjectQuery=(ObjectQuery)查询;
objectQuery.Include(“城市”);
objectQuery.Include(“国家”);
ObjectResult=(ObjectResult)objectQuery.Execute(MergeOption.OverwriteChanges);
bp.BPAddresses=new System.Collections.ObjectModel.ObservableCollection(result.ToList());
这里的问题是“城市”属性无法刷新。
3.已尝试:objectContext.LoadProperty(bp,“BPAddresses”,MergeOption.OverwriteChanges);
所有这些都起了部分作用。实现这一目标的最佳实践是什么

任何帮助都将不胜感激

谢谢,
K.Mitev不提供丢弃更改。EF也没有二级缓存,所以一旦您处理了一个带有更改的上下文,并创建了一个新的上下文来从数据库加载数据,您将得到未更改的数据

这里的问题是这个实体 框架缓存东西和旧数据 对象会附着到旧对象上 如果 用户单击“取消”,然后再次编辑 然后单击保存

当用户单击“取消”时,必须丢弃编辑中使用的所有对象及其上下文。这些对象和上下文都死了。一旦用户再次单击“编辑”,您必须再次从数据库加载所有内容


刷新导航属性效果不太好。例如,一旦您向导航集合中添加了某些内容,它将永远不会通过从数据库中刷新而被删除。

谢谢您的回答。我遇到的问题是,我不想在用户单击“取消”后丢弃所有对象,因为我从同一上下文加载了拾取列表项,这些项很难加载。您可能会建议“从单独的上下文加载这些对象”,问题是,当我编辑的对象引用来自不同上下文的那些picklist对象时,我尝试保存的对象将遇到麻烦。我想没有什么可以做的,这是实体框架的一个缺点。是的,你不能有跨上下文引用。它总是抛出异常。我通常建议使用克隆对象。维护未更改的主要数据,并克隆它们进行编辑。您也可以尝试使用拾取列表来执行此操作。
       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);