2016-07-19 37 views
0

我收到錯誤消息'The operation failed:The relationship can not be changed because one or more of the foreign-key properties is non-nullable'。當使用Entity Framework 6.1時。我不明白的是爲什麼我只有一個特定的記錄。EF - 爲特定邊界案例更新多對多關係時出錯

涉及到三個表格:User,Role,UserRoles。 UserRoles具有用戶和角色的FK(鏈接表)。

EF(DB to Entities)構造了兩個實體:用戶和角色。用戶實體擁有一個集合屬性角色和角色實體擁有一個集合屬性Users。我正在嘗試更新用戶的現有角色被添加/從用戶的角色屬性中刪除。

延遲加載啓用默認爲false。以斷開的方式工作。

userWithUpdatedData被作爲參數發送到該代碼:

using (entities = new Entities()) 
{ 
    try 
    { 
     var userQuery = entities.Users.AsQueryable(); 

     userQuery = userQuery.Include(u => u.Roles); 

     User userInDB = (from u in userQuery 
         where u.id == userBDO.id 
         select u).FirstOrDefault(); 

     if (userInDB == null) return false; 

     entities.Users.Remove(userInDB); // rowversion requirement 

     entities.Users.Attach(userInDB); 
     entities.Entry(userInDB).State = System.Data.Entity.EntityState.Modified;      

     userInDB.Roles.Clear(); // remove all current roles 

     // paint with new Roles 
     List<int> roleIds = new List<int>(); 

     if (userWithUpdatedData.Roles != null) 
     { 
      foreach (Role r in userWithUpdatedData.Roles) 
      { 
       roleIds.Add(r.id); 
      } 
     } 

     var roles = (from r in entities.Roles 
        where roleIds.Contains(r.id) 
        select r); 

     foreach (Role role in roles) 
     { 
      userInDB.Roles.Add(role); 
      entities.Entry(role).State = EntityState.Unchanged; 
     } 

     entities.SaveChanges(); 
    } 
    catch(Exception e) {} 
} 

對於系統中的此代碼工作正常,但用於與ID的單個用戶的所有其他用戶= 1(和與系統中的大多數活性)此代碼失敗。當我刪除更新角色用戶ID爲1的代碼更新正確(當然沒有角色)。

這段代碼有什麼問題和/或爲什麼它只會失敗一個單一的實體,併爲所有其他工作正常?

UPDATE因此,當用戶嘗試更新自我並且用戶是一個或多個角色(角色具有用戶創建/更新的FK鏈接)的作者時會發生這種情況。

回答

0

在這一行:

entities.Users.Remove(userInDB); // rowversion requirement 

所有角色都被標記爲刪除導致的問題。

我需要移動這一行:

userInDB.Roles.Clear(); 

上面。