2017-08-05 38 views
0

我正在開發一個帶有angularjs項目的asp.net web api。我的項目實際上是混合粒度認證。我的項目中有幾個表格,但只有三個表格會導致插入問題。三個表格是AspNetRoles,RolePermission和Roles。而他們之間的關係是:無法在asp.net中使用LINQ插入數據到多對多關係中

enter image description here

有在角色表三個角色。員工,經理和管理員。當管理員更改任何角色權限時,舊的角色權限將被刪除,並將新的權限插入到AspNetRoles表中。但是,執行此操作時會發生錯誤。錯誤是:

違反PRIMARY KEY約束'PK_dbo.AspNetRoles'。不能在對象'dbo.AspNetRoles'中插入重複鍵。重複的鍵值是(dbc1ae5c-a8a7-4aa9-b62e-0948e6e2856c)

我的代碼是刪除和更新許可

public void SaveUpdateRolePermission(RoleWisePermission rolePermissionList) 
    { 
     var RoleObject = db.Roles.Where(s => s.Id == rolePermissionList.RoleId).FirstOrDefault(); 

     if (RoleObject.AspNetRoles.Any()) 
     { 
      foreach (var rolePermission in RoleObject.AspNetRoles.ToList()) 
      { 
       RoleObject.AspNetRoles.Remove(rolePermission); 
       db.SaveChanges(); 
      } 
     } 

     foreach (AspNetRoles Role in rolePermissionList.PermissionList.Distinct()) 
     { 
      RoleObject.AspNetRoles.Add(Role); 
     } 


     db.SaveChanges(); 
     db.Dispose(); 

    } public class RoleWisePermission 
{ 
    public List<AspNetRoles> PermissionList { get; set; } 
    public System.Guid RoleId { get; set; } 
} 

發生問題時db.saveChanges()。請幫我解決這個問題。

我已經刪除了所有與RoleId相關的AspNetRoles。所以沒有機會複製螞蟻項目。還要記住,即使Role Permission表中沒有數據,也會發生問題。並且我還檢查了rolePermissionList.PermissionList的不同項目。如果我從角色對象中刪除特定角色ID的數據,然後檢查角色權限表中是否有任何返回true的AspNetRoles。角色許可表中沒有數據的地方。請幫我解決這個問題

回答

0

乍一看,這看起來很可能是您的roleWisePermissions未被識別爲與上下文關聯的實體的情況。無論何時處理實體,確保所有引用都設置爲上下文知道的實體很重要。 (或者從該上下文加載,或者附加到該上下文)。當給上下文賦予未知實體時,默認行爲是嘗試插入它。

RoleObject是從您當前的DbContext實例加載的,但是roleWisePermissionList.AspNetRoles?在你的例子中,不清楚「db」的範圍是什麼,以及這些實體/對象在哪裏填充。除非您正在使用EntityTypeConfiguration,否則RoleWisePermission的類聲明看起來不像實體聲明(無密鑰聲明,非虛擬集合)。

對於多對多關係,您通常希望從上下文加載兩個適用的集合,設置替換並保存。通常我使用的方法是一次選擇實體,然後在關聯中使用這些參考。

I.e.

var apsNetRoleIds = roleWisePermission.PermissionsList.Select(x=>x.PermisionId).ToList(); 
var aspNetRoles = db.AspNetRoles.Where(x=> aspNetRoleIds.Contains(x=> x.PermissionId); 

RoleObject.AspNetRoles.AddRange(aspNetRoles); // Assuming List<>, otherwise, iterate and add. 
相關問題