【问题标题】:Discard Changes with Entity Framework 4 POCO使用 Entity Framework 4 POCO 放弃更改
【发布时间】:2011-07-19 01:08:24
【问题描述】:

我正在使用带有 WPF 的 Entity Framework 4.0 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.米特夫

【问题讨论】:

    标签: entity-framework-4 poco


    【解决方案1】:

    EF 不提供丢弃更改。 EF 也没有二级缓存,因此一旦您处理具有更改的上下文并创建新上下文以从数据库加载数据,您将获得未更改的数据。

    这里的问题是实体 框架缓存东西和旧的 物件依附于旧物 上下文,如果 用户单击取消然后再次编辑 然后点击保存。

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

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

    【讨论】:

    • 感谢您的回答。我遇到的问题是,我不想在用户单击取消后丢弃所有对象,因为我从相同的上下文加载了选项列表项,这些项加载起来很重。您可能会建议“从单独的上下文中加载那些”,问题在于,当我编辑的对象从不同的上下文中引用这些选项列表对象并且我尝试保存时,我会遇到麻烦。我想没有什么可以做的,这是实体框架的一个缺点。
    • 是的,您不能有跨上下文引用。它总是抛出异常。我通常推荐克隆对象。维护您的主要未更改数据并克隆它们以进行编辑。您也可以尝试使用选择列表来做到这一点。
    猜你喜欢
    • 2011-12-28
    • 2011-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多