C# 在删除之前未触发的实体对象上的更新

C# 在删除之前未触发的实体对象上的更新,c#,.net,entity-framework,entity-framework-4,C#,.net,Entity Framework,Entity Framework 4,所以基本上,我试图在实体框架中完成这一系列事件 创建新帐户 获取现有帐户 将所有数据从旧帐户移动到新帐户(交易、用户等) 删除旧帐户 我在一个ObjectContext中“一次性”完成这一切 在上下文中调用SaveChanges时失败。我得到一个外键约束错误 我在SQL profiler中检查了这一点,结果发现entity framework没有发送任何更新,只发送选定的更新,然后发送删除 我有点理解为什么它是这样工作的,但必须有某种方法迫使它正常工作,而不必调用SaveChanges()两次或

所以基本上,我试图在实体框架中完成这一系列事件

  • 创建新帐户
  • 获取现有帐户
  • 将所有数据从旧帐户移动到新帐户(交易、用户等)
  • 删除旧帐户
  • 我在一个ObjectContext中“一次性”完成这一切

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

    我在SQL profiler中检查了这一点,结果发现entity framework没有发送任何更新,只发送选定的更新,然后发送删除

    我有点理解为什么它是这样工作的,但必须有某种方法迫使它正常工作,而不必调用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;
                }
            }
        }
    }
    
    公共虚拟ICollection用户
    {
    得到
    {
    如果(_users==null)
    {
    var newCollection=newfixupcollection();
    newCollection.CollectionChanged+=FixupUsers;
    _用户=新集合;
    }
    返回用户;
    }
    设置
    {
    如果(!ReferenceEquals(_用户,值))
    {
    var-previousValue=\u用户作为FixupCollection;
    如果(上一个值!=null)
    {
    previousValue.CollectionChanged-=FixupUsers;
    }
    _用户=价值;
    var newValue=作为FixupCollection的值;
    if(newValue!=null)
    {
    newValue.CollectionChanged+=FixupUsers;
    }
    }
    }
    }   
    私有void FixupUsers(对象发送方,NotifyCollectionChangedEventArgs e)
    {
    如果(如NewItems!=null)
    {
    foreach(e.NewItems中的用户项)
    {
    项目.账户=本项目;
    }
    }
    如果(例如,OldItems!=null)
    {
    foreach(e.OldItems中的用户项)
    {
    if(ReferenceEquals(item.Account,this))
    {
    item.Account=null;
    }
    }
    }
    }
    
    在for循环中使用object作为添加和删除对象的参考,这是在添加对象时使用object按键instate获取对象的最佳解决方案

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

    好的,我找到了解决办法@CodeGorilla的评论给了我一个暗示

    基本上我只需要打个电话

    _context.SaveChanges(SaveOptions.AcceptAllChangesAfterSave);
    

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

    你是如何进行变更跟踪的?您是在使用代理,还是在调用
    DetectChanges
    ?您是如何进行更改跟踪的?您是在使用代理,还是在调用
    DetectChanges