2017-08-05 66 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. 
相关问题