10
votes

Violation de la principale contrainte principale dans l'entité Framework Code Première table de lien

J'ai une table utilisateur et une table de rôles. Il existe une table de liaison utilisatrices générées automatiquement contenant l'ID des tables de l'utilisateur et des rôles. Ceci est généré à l'aide du code suivant:

 RoleGroup group = Context.RoleGroups.Create();
 group.Title = roleGroupName;
 Context.Set<RoleGroup>().Add(group);
 Context.SaveChanges();


10 commentaires

Vous devriez publier le code qui ajoute l'entité au contexte


Pouvez-vous montrer exactement ce que vous avez vérifié? Je soupçonne que vous avez seulement vérifié que le «code> rôle et utilisateur sont inchangés.


Merci pour les questions, j'ai mis à jour ma question pour ajouter encore plus d'informations. Espérons que cela aide.


Avez-vous voulu dire context.set () Ajouter (groupe); ?


Il y a d'abord la table des utilisateurs, mais l'extrait est alors fait référence au groupe de rôle. Je manque certainement quelque chose ici.


@hvd ouais c'est ce que je veux dire. Mettre à jour maintenant, merci.


@Wiktor ZYCHLA La table des syndroids est une table de liaison générée automatiquement. Le groupe de rôle n'est pas liée, c'est là que je reçois l'erreur d'essayer d'ajouter un groupe de rôle.


Je ne l'obtiens toujours pas. Comment ajouter un groupe de rôle peut-il causer la violation de la clé primaire dans une table USerroles non liée?


C'est pourquoi je pose la question.


Ce n'est probablement pas l'extrait montré qui provoque la question.


4 Réponses :


5
votes

Le fait que le utilisateur code> avec userid = 2beaf837-9034-4376-9510-b1609c54efbe code> et le rôle code> avec roled = DCD16D00-D46E-4D48-8328-3E7B35B11CCFF code> est dans l'état inchangé code> ne signifie pas que rien n'est écrit dans la base de données.

surtout pour de nombreuses relations (généralement pour indépendantes Associations) EF maintient un État pour la relation forte> elle-même différente de l'état fort> de l'entité forte>. Si une entrée est insérée dans la table de liens, cela signifie que l'entrée de la relation pour les deux entités en question est dans l'état ajouté code> bien que l'état d'entité pour ces entités est inchangé code>. Vous ne pouvez pas voir l'entrée de la relation lors de l'énumération du dbcontext code> s changetracker code>. Il ne rentrera que des états d'entité. Vous devez descendre vers l'objet sous-jacent ObjectContext code> à la requête pour l'état de la relation. P>

Exemple: P>

using (var ctx = new MyContext())
{
    var user = ctx.Users.Find(1);
    var role = ctx.Roles.Find(5);

    user.Roles = new List<Role>();
    user.Roles.Add(role);

    ctx.SaveChanges();
}


0 commentaires

1
votes

Vous essayez d'insérer la même combinaison d'utilisateur / rôle dans la table USerroles:

violation de la contrainte principale "PK_USERSROLES". Impossible d'insérer une clé en double dans l'objet 'dbo.usersroles'. La valeur clé en double est (2Beaf837-9034-4376-9510-B1609C54EFBE, DCD16D00-D46E-4D48-8328-3E7B35B11CCF). La déclaration a été résiliée.

Vérifiez que l'utilisateur a l'identifiant de 2Beaf837-9034-4376-9510-B1609C54EFBE et quel rôle a l'ID de DCD16D00-D46E-4D48-8328-3E7B35B11CCF. Si vous êtes sûr que vous n'ayez pas seulement entré cet utilisateur une fois, est la méthode qui insère les données appelées plus d'une fois sans vous rendre compte?


0 commentaires

6
votes

Pour ajouter à la réponse de SLAUUMA, on dirait que vous définissez la propriété ICollection sur l'une de ces choses automobiles à plusieurs choses, EF est confus et ne réalise pas que vous nettoyez les éléments de collections en faisant cela. < P> Donc, au lieu de faire cela: xxx

Vous devez le faire: xxx

Ceci a fonctionné pour moi.

Vous ne devriez pas avoir à le faire. Cela devrait être un bug dans ef.


2 commentaires

Il suffit d'avoir le même problème ici. Certainement devrait être considéré comme un bug.


Même problème ici. Dans mon cas, j'ai une propriété de navigation sur un objet enfant dans une configuration de table-per-héritière. Pour le faire fonctionner correctement, je dois charger manuellement les enfants de l'entité via le dbcontext.Entry (entité) .Collection (x => x.children) .charger (). Il suffit de les charger via une requête ne suffit pas. Ensuite, pour mettre à jour la liste, je dois effacer et ajouter les nouvelles entrées.



0
votes

En espérant que quelqu'un trouvera utile, j'ai découvert qu'il y a une grande différence entre modifier une liste existante dans EF par rapport à la création d'une nouvelle liste.

Dans ce cas, je faisais une mise à jour et je pensais que cela est le plus facile de construire une nouvelle liste des articles que je voulais. Mais si certains des articles ont déjà été ajoutés à la liste, j'aurais une violation clé primaire lors de l'épargne.

J'ai fini par suivre la même liste et je fais des modifications. Le nettoyage et la lecture était correct, créant une nouvelle liste n'était pas.


0 commentaires