所以基本上我正在尝试在实体框架中执行这一系列事件。
- 创建一个新账户
- 获取现有帐户
- 将所有数据从旧帐户移动到新帐户(交易、用户等)
- 删除旧帐户
我在单个 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;
}
}
}
}