删除前未触发的实体对象的更新

时间:2012-09-18 17:00:03

标签: c# .net entity-framework entity-framework-4

所以基本上我正在尝试在实体框架中执行这一系列事件。

  1. 创建新帐户
  2. 获取现有帐户
  3. 将旧帐户中的所有数据移至新帐户(交易,用户等)
  4. 删除旧帐户
  5. 我在“一次性”中完成所有操作,在一个ObjectContext中。

    当我在上下文中调用SaveChanges时失败。我得到一个外键约束错误。

    我在SQL分析器中检查了这一点,结果发现实体框架没有发送任何更新,只是选择了然后删除。

    我有点理解为什么它会这样工作,但必须有一些方法来强制它正常工作,而不必两次调用SaveChanges()或其他东西。

    希望。


    我的合并功能基本上就像这样

    public void Merge(Account newAccount, Account oldAccount)
    {
        // ...
    
        foreach (var user in oldAccount.Users.ToList())
        {
            oldAccount.Users.Remove(user);
            newAccount.Users.Add(user);
        }
    
        // ...
    
        _unitOfWork.Accounts.Delete(oldAccount);
    }      
    

    对象是E.F.4 POCO实体生成器创建的POCO对象。为了避免粘贴整个类,这里​​只是其中一个关联属性的'fixup'函数。

    public virtual ICollection<User> Users
    {
        get
        {
            if (_users == null)
            {
                var newCollection = new FixupCollection<User>();
                newCollection.CollectionChanged += FixupUsers;
                _users = newCollection;
            }
            return _users;
        }
        set
        {
            if (!ReferenceEquals(_users, value))
            {
                var previousValue = _users as FixupCollection<User>;
                if (previousValue != null)
                {
                    previousValue.CollectionChanged -= FixupUsers;
                }
                _users = value;
                var newValue = value as FixupCollection<User>;
                if (newValue != null)
                {
                    newValue.CollectionChanged += FixupUsers;
                }
            }
        }
    }   
    
    private void FixupUsers(object sender, NotifyCollectionChangedEventArgs e)
    {
        if (e.NewItems != null)
        {
            foreach (User item in e.NewItems)
            {
                item.Account = this;
            }
        }
    
        if (e.OldItems != null)
        {
            foreach (User item in e.OldItems)
            {
                if (ReferenceEquals(item.Account, this))
                {
                    item.Account = null;
                }
            }
        }
    }
    

2 个答案:

答案 0 :(得分:0)

使用object作为引用在for循环中添加和删除,这是通过在添加时使用对象的key instate来获取对象的最佳解决方案。

 oldAccount.Users.Remove(user);
 newAccount.Users.Add(users.FirstOrDefault(t=>t.ID = user.Id));

答案 1 :(得分:0)

好的想出了解决方案。 @ CodeGorilla的评论给了我一个提示。

基本上我只需要打电话

_context.SaveChanges(SaveOptions.AcceptAllChangesAfterSave);

尝试删除帐户之前。这会强制实体框架执行数据库中的所有更新。之后删除它没有问题。