2013-05-10 75 views
1

在我的應用程序中,用戶可以分配角色。在此設置頁面,我有以下代碼:外鍵在創建時更新,但不在編輯時更新

foreach (string userRole in roleArray) 
{ 
    OrganizationRole orgRole = signedUpOrg.Roles.FirstOrDefault(target => target.Name == userRole && target.OrganizationId == signedUpOrg.OrganizationId); 
    if (orgRole != null) 
    { 
     OrganizationUser_OrganizationRole existingUserRole = orgRole.OrganizationUser_OrganizationRole.FirstOrDefault(target => target.Organization_User.User.UserId == orgUser.User.UserId && 
                                   target.OrganizationRole.Name   == userRole && 
                                   target.OrganizationRole.OrganizationId == signedUpOrg.OrganizationId); 

     if (existingUserRole == null || orgUser.User.UserId == 0) // new user role to new users or existing users with new roles 
     { 
      orgRole.OrganizationUser_OrganizationRole.Add(new OrganizationUser_OrganizationRole 
      { 
       Organization_User = orgUser, 
       OrganizationRole = orgRole 
      }); 
     } 
    } 
} 

有了這個,我們可以通過循環將被分配,並將其保存在數據庫中的角色。這對創建用戶及其角色非常合適,但在編輯時不會發生變化。代碼似乎在正確的數據(角色等)的關鍵點被擊中,但沒有反映在數據庫或前端。

此代碼是在一類稱爲CommonUtilities的方法稱爲SaveUsers,被稱爲與下面的代碼的AdministrationController:

CommonUtilities.SaveUsers(viewModel); 

任何人都可能想到的任何理由,爲什麼這會正常的工作創造但不是在編輯時?非常感謝,我會很樂意澄清任何問題。

+0

這與創建新用戶時使用的代碼是否相同?或者這只是爲了更新? – SOfanatic 2013-05-10 13:16:09

+0

你能提供SaveUsers方法中的代碼嗎?您正在使用EF還是ADO? – 2013-05-10 13:16:54

+0

@SOfanatic這是在我的管理員用戶可以使用的「快速帳戶設置」頁面中創建和更新用戶的相同代碼。它適用於創建,但不適用於更新。 – 2013-05-10 13:21:10

回答

1

一個類似的問題促使我選擇NHibernate而不是EF,因爲它可以更新兒童和孫集合(可能更深層次,但我沒有嘗試過)。像@JhonatasKleinkauff所提到的答案一樣調整ObjectState似乎是EF中唯一的答案,但在我們的案例中並不令人滿意。這似乎只發生在從檢索和保存父對象之間斷開ObjectContext。

+0

是的,這似乎是一個問題,因爲我們不久前升級了我們的EF,所以我不確定我們是否遠遠落後於時代,或者這是最近發生的變化,但這肯定是一種激怒!我們確實在某些情況下應用了「SetAsModified」(正如我最近的評論所顯示的那樣),但也許我們錯過了必要的一個。謝謝你的幫助! – 2013-05-10 14:03:15