所以基本上我正在尝试在实体框架中执行这一系列事件。
我在“一次性”中完成所有操作,在一个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;
}
}
}
}
答案 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);
尝试删除帐户之前。这会强制实体框架执行数据库中的所有更新。之后删除它没有问题。