Comment éviter de Système.Les données.De l'entité.L'Infrastructure.DbUpdateException
J'ai cette DbContext objet qui se compose de
- Employee
- CompanyAddress (PK: AddressFirstLine, City)
Note: one Employee can have many CompanyAddress
Enregistrements sont ajoutés à CompanyAddress table seulement si une adresse n'existe pas dans CompanyAddress table.
Si j'ai deux DBContext objets de la base de données de dire Snapshot1, Snapshot2.
Dire lorsque les deux ces captures d'écran ont été prises, il n'y avait pas de dossier dans CompanyAddress table.
Lorsque des modifications ont été apportées à Snapshot1 et sauvé - enregistrements sont écrits à CompanyAddress table.
Lorsque des modifications ont été apportées à Snapshot2 et enregistré à l'aide de
mydataContext.SaveChanges();
exception se produit:
System.Data.Entity.Infrastructure.DbUpdateException: An error occurred while updating the entries
System.Data.SqlClient.SqlException: Violation of PRIMARY KEY constraint 'PK_CompanyAddress'. Cannot insert duplicate key in object 'dbo.CompanyAddress'
Il semble économie de Snapshot1 fait Snapshot2 sale parce que quand ils sont sauvegardés dans la base de données, tous deux avaient même CompanyAddress dossiers.
Ce que d'autres appellent/paramètres je peux faire sur dbContext objet pour éviter cette erreur?
Merci!
OriginalL'auteur user1552869 | 2013-12-24
Vous devez vous connecter pour publier un commentaire.
Votre erreur n'a rien à voir avec le DbContext objets. Votre problème est que vous tentez d'insérer un enregistrement avec la duplication de clé primaire. C'est ce que votre message d'exception dit.
De voir comment vous pouvez créer votre CompanyAddress objets et quelles sont les touches lorsque vous les enregistrez - ce qui va vous donner des indices.
Edit: Et c'est une mauvaise idée d'avoir la clé primaire une clé naturelle, c'est à dire que vous ne devez pas affecter ville et adresse de clés primaires. Vous devriez avoir Guid ou Entier pour être la clé primaire qui ne dépend pas de l'information stockée dans la base de données.
Et pour renforcer l'unicité, avant de vous enregistrer dans la base de données, vous vérifiez si l'enregistrement existe, et peut ajouter un index unique pour table de base de données basée sur les contraintes.
Est-il une raison pour avoir 2 dbContexts? ces choses sont censées être utilisées comme des singletons
L'erreur qui se passait en raison de problème de concurrence. Pour l'instant, nous avons juste mis un try-catch autour de ce morceau de code et a enregistré l'erreur.
OriginalL'auteur trailmax