无法使用LINQ在asp.net中将数据插入到多对多关系中

时间:2017-08-05 04:12:11

标签: c# entity-framework linq linq-to-sql entity-framework-6

我正在开发一个带有angularjs项目的asp.net web api。我的项目实际上是混合粒度认证。我的项目中有几个表,但只有三个表会导致插入问题。三个表是AspNetRoles,RolePermission和Roles。他们的关系是:

enter image description here

Roles表中有三个角色。员工,经理和管理员。当admin更改任何Role权限时,将删除旧的Role权限,并在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的不同项。如果我从Role对象中删除特定Role id的数据,然后检查Role Permission表中是否有返回true的AspNetRoles。如何在角色权限表中没有数据的情况下。请帮我解决这个问题

1 个答案:

答案 0 :(得分:0)

乍一看,这可能是您的roleWisePermissions未被识别为与上下文关联的实体的情况。每当您处理实体时,确保将所有引用设置为上下文所知的实体非常重要。 (从该上下文加载或附加到它。)当给上下文一个未知实体时,默认行为是尝试插入它。

RoleObject是从您当前的DbContext实例加载的,但是roleWisePermissionList.AspNetRoles?从您的示例中,不清楚“db”的范围是什么,以及填充这些实体/对象的位置。 RoleWisePermission的类声明看起来不像实体声明(无键声明,非虚拟集合),除非您使用EntityTypeConfiguration。

对于多对多关系,您通常希望从上下文加载适用的集合,设置重播并保存。通常我使用的方法是一次性选择实体,然后在关联中使用这些引用。

即。

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.