0

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

  1. 创建一个新账户
  2. 获取现有帐户
  3. 将所有数据从旧帐户移动到新帐户(​​交易、用户等)
  4. 删除旧帐户

我在单个 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);
}      

这些对象是由 EF4 POCO 实体生成器创建的 POCO 对象。为了避免粘贴整个类,这里​​只是一个关联属性及其“修复”功能。

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;
            }
        }
    }
}
4

2 回答 2

0

您使用对象作为引用在 for 循环中添加和删除,这是在添加时使用对象的状态下通过键获取对象的最佳解决方案。

 oldAccount.Users.Remove(user);
 newAccount.Users.Add(users.FirstOrDefault(t=>t.ID = user.Id));
于 2012-09-18T19:27:53.707 回答
0

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

基本上我只需要打电话

_context.SaveChanges(SaveOptions.AcceptAllChangesAfterSave);

在尝试删除帐户之前。这迫使实体框架执行数据库中的所有更新。之后删除它就没有问题了。

于 2012-09-19T08:31:58.850 回答