【问题标题】:Updates on an entity object not firing before delete实体对象的更新在删除前未触发
【发布时间】:2023-03-14 02:25:01
【问题描述】:

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

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

对象是由 E.F.4 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;
            }
        }
    }
}

【问题讨论】:

  • 您如何进行变更跟踪?你是在使用代理,还是打电话给DetectChanges
  • 您如何进行变更跟踪?你是在使用代理,还是打电话给DetectChanges

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


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    好的,找到了解决方案。 @CodeGorilla 的评论给了我一个提示。

    基本上我只需要打电话

    _context.SaveChanges(SaveOptions.AcceptAllChangesAfterSave);
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-30
      • 2020-06-06
      • 2018-05-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-09
      • 2011-10-05
      相关资源
      最近更新 更多