2017-08-05 6 views
0

Je développe une API web asp.net avec le projet angularjs. Mon projet est en réalité l'authentification par granularité hybride. Il y a plusieurs tables dans mon projet mais il n'y a que trois tables qui créent un problème avec l'insertion. Trois tables sont AspNetRoles, RolePermission et Rôles. Et leur relation est:Impossible d'insérer des données dans des relations many-to-many dans asp.net en utilisant LINQ

enter image description here

Il y a trois rôles dans le tableau des rôles. Employé, gestionnaire et administrateur Lorsque l'administrateur modifie une autorisation de rôle, l'ancienne autorisation de rôle est supprimée et une nouvelle autorisation est insérée dans la table AspNetRoles. Cependant, une erreur se produit lorsque cette opération est exécutée. L'erreur est:

Violation de la contrainte PRIMARY KEY 'PK_dbo.AspNetRoles'. Impossible d'insérer une clé en double dans l'objet 'dbo.AspNetRoles'. La valeur clé en double est (dbc1ae5c-a8a7-4aa9-b62e-0948e6e2856c)

Mon code est d'enlever et l'autorisation de mise à jour

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; } 
} 

Un problème se produit lorsque db.saveChanges(). S'il vous plaît, aidez-moi à résoudre ce problème.

J'ai déjà supprimé tous les AspNetRoles liés à RoleId. Il n'y a donc aucune chance de dupliquer des objets ant. Et rappelez-vous également que le problème est survenu même s'il n'y a pas de données dans la table Role Permission.Et je vérifie également les éléments distincts de rolePermissionList.PermissionList. Et si je supprime des données de l'objet Rôle pour un ID de rôle spécifique, puis vérifiez qu'il existe des AspNetRoles dans la table d'autorisation de rôle qui retournent true. Comment c'est possible là où il n'y a pas de données dans la Table d'autorisation des rôles. S'il vous plaît aidez-moi à résoudre ce problème

Répondre

0

À première vue, il semblerait que ce soit probablement le cas où vos roleWisePermissions ne sont pas reconnues comme des entités associées au contexte. Chaque fois que vous traitez avec des entités, il est important de vous assurer que toutes les références sont définies sur des entités connues du contexte. (Soit chargé à partir de ce contexte, ou attaché à lui.) Quand un contexte est donné à une entité inconnue, le comportement par défaut est de tenter de l'insérer.

RoleObject a été chargé à partir de votre instance actuelle de DbContext, cependant le roleWisePermissionList.AspNetRoles? D'après votre exemple, la portée de "db" n'est pas claire, et où ces entités/objets ont été peuplés. La déclaration de classe pour RoleWisePermission ne ressemble pas à une déclaration d'entité (aucune déclaration de clé, collection non virtuelle) sauf si vous utilisez une EntityTypeConfiguration pour cela.

Avec les relations plusieurs-à-plusieurs, vous souhaitez généralement charger les deux collections applicables à partir du contexte, configurer les replacations et enregistrer. Souvent, l'approche que j'utilise consiste à sélectionner les entités en une fois, puis à utiliser ces références dans l'association.

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.