所以基本上我試圖在實體框架中執行這一系列事件。在刪除之前沒有觸發的實體對象的更新
- 創建一個新帳戶
- 取得現有帳戶
- 移動所有從舊帳戶的新帳戶中的數據(交易,用戶等)
- 刪除舊賬
我在'一次過'中完成了這一切,在一個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'? – CodingGorilla
你最近怎麼做變化跟蹤?你在使用代理服務器,還是在調用'DetectChanges'? – CodingGorilla