2010-05-05 126 views
0

我想不通,爲什麼在不改變的對象我重視的SaveChanges調用()以下代碼結果:實體框架:附加實體沒有保存

public void Update() 
{ 
AccountUser accountUser = new AccountUser(); 

// update 
using (var db = new MedicalSystemDBEntity()) 
{ 
    var query = from user in db.AccountUsers 
       where user.id == this.UserID 
       select user; 

    if (query.Count() > 0) 
    { 
     accountUser = query.First(); 

     accountUser.AccountRoles.Load(); 
     accountUser.SecurityNavigationNodes.Load(); 

     // delete existing user roles before re-attaching 
     if (accountUser.AccountRoles.Count > 0) 
     { 
      foreach (AccountRole role in accountUser.AccountRoles.ToList()) 
      { 
       accountUser.AccountRoles.Remove(role); 
      } 
     } 

     db.SaveChanges(); 

     // get roles to add 
     List<int> roleIDs = new List<int>(); 

     foreach (UserRole r in this.AccountRoles) 
     { 
      roleIDs.Add(r.RoleID); 
     } 

     var roleEntities = from roles in db.AccountRoles 
          where roleIDs.Contains(roles.id) 
          select roles; 

     accountUser.AccountRoles.Attach(roleEntities); 

     accountUser.username = this.Username; 
     accountUser.firstname = this.FirstName; 
     accountUser.middlename = this.MiddleName; 
     accountUser.lastname = this.LastName; 
     accountUser.enabled = this.Enabled; 

     if (this.LastActivityDate != null || this.LastActivityDate != DateTime.MinValue) 
      accountUser.lastactivitydate = this.LastActivityDate; 

     db.SaveChanges(); 
    } 
} 

}

在調試程序,我看到正在加載正確的roleEntities,並且它們是有效的對象。但是,如果我使用SQL事件探查器,則看不到UPDATE或INSERT查詢,結果沒有保存我的連接對象。

+0

記住我不是想添加一個新用戶,我也不想添加一個新的帳戶角色......我只想將accountUser與一組新的AccountRoles相關聯(這裏有一個多對多的帳戶) AccountRoles和AccountUsers之間通過連接表有很多關係) – 2010-05-05 19:19:34

+0

在你的例子中,請指定你的上下文範圍和生命週期。例如。通過定義「using()...」塊。您使用'accountUser',但我們無法知道該對象正在發生什麼。另外,儘量不要在代碼片段中使用'var':) – kervin 2010-05-05 19:25:34

+0

Kervin:我現在已經添加了一個更大的代碼示例:)這是我的第一個Stackoverflow文章,非常抱歉。 – 2010-05-05 19:29:28

回答

3

他們沒有保存,因爲您在附加它們之前更改實體。上下文(通常)跟蹤更改,因此不會跟蹤對已分離實體的更改。因此,沒有什麼可以保存。

+0

好吧,我並沒有試圖改變角色本身......我試圖改變與用戶相關的角色。也許我誤解了一些東西? 用戶和帳戶角色使用連接表具有多對多關係。連接表不能直接訪問,因爲它構成了導航屬性(對嗎?)。因此,向用戶添加新角色應在此表中添加一個條目。 – 2010-05-05 19:17:44

0

關閉我的頭頂,不應該在從帳戶中刪除角色後執行SaveChanges()?你不只是刪除附加到用戶的角色,然後重新附加相同的角色?既然保存了這些變化,它會不會改變呢?

+0

我嘗試在刪除後調用SaveChanges(),然後在重新連接後再次調用SaveChanges()。事情是,我將刪除舊的角色並添加新的角色。可能會有更多,更少或不同的角色正在重新安裝,而不是之前的那些角色。 例如,用戶可能沒有角色,但在重新連接時可能會向用戶添加新角色。 – 2010-05-05 19:16:26

+0

那麼,如果你刪除不應該在做db.DeleteObject(角色),而不是從上下文中刪除它們? – Paul 2010-05-05 19:21:27

+0

我試着做一個DeleteObject,但是刪除了角色...我希望角色保持原樣,因爲它可能與其他用戶相關聯......我只想要AccountUser的帳號關聯關係被刪除。在普通的SQL中,我只是刪除表中連接AccountUser和AccountRole的條目。我並沒有試圖去除實際的角色本身 – 2010-05-05 19:23:35

0

有時它是因爲授權對象在分離時被修改。文章here將顯示如何清除該問題。