2012-09-18 44 views
0

所以基本上我試圖在實體框架中執行這一系列事件。在刪除之前沒有觸發的實體對象的更新

  1. 創建一個新帳戶
  2. 取得現有帳戶
  3. 移動所有從舊帳戶的新帳戶中的數據(交易,用戶等)
  4. 刪除舊賬

我在'一次過'中完成了這一切,在一個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; 
      } 
     } 
    } 
} 
+1

你最近怎麼做變更追蹤?你在使用代理服務器,還是在調用'DetectChanges'? – CodingGorilla

+0

你最近怎麼做變化跟蹤?你在使用代理服務器,還是在調用'DetectChanges'? – CodingGorilla

回答

0

好的算出瞭解決方案。 @ CodeGorilla的評論給了我一個提示。

基本上我只需要嘗試刪除該帳戶之前調用

_context.SaveChanges(SaveOptions.AcceptAllChangesAfterSave); 

。這迫使實體框架執行數據庫中的所有更新。之後,刪除它沒有問題。

0

您使用對象作爲參照添加和刪除裏面的for循環,最好的解決方案通過使用一個對象時添加的關鍵instate獲取對象。

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