C# 在删除之前未触发的实体对象上的更新
所以基本上,我试图在实体框架中完成这一系列事件C# 在删除之前未触发的实体对象上的更新,c#,.net,entity-framework,entity-framework-4,C#,.net,Entity Framework,Entity Framework 4,所以基本上,我试图在实体框架中完成这一系列事件 创建新帐户 获取现有帐户 将所有数据从旧帐户移动到新帐户(交易、用户等) 删除旧帐户 我在一个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
?