2016-07-29 2 views
2

Je dois supprimer et ajouter des entités avec la même valeur de clé primaire dans une seule requête, quelqu'un peut-il me suggérer la solution? Ci-dessous est mon code exemple qui donne l'erreur: Violation de la contrainte PRIMARY KEY 'PK_Table'. Impossible d'insérer une clé dupliquée dans l'objet 'dbo.Table'.Entity Framework: Supprimer et ajouter des entités avec la même clé dans une seule requête

context.Set<Entity>().Attach(existingEntityObj); 
Entry(existingEntityObj).State = EntityState.Deleted; 

context.Set<Entity>().Add(newEntityObj); 
context.Entry<Entity>(newEntityObj).State = EntityState.Added; 

context.SaveChanges(); 

On suppose à la fois les objets (existingEntityObj et newEntityObj) ont la même valeur dans la propriété clé primaire.

merci d'avance !!

+1

Vous devez supprimer la contrainte de clé primaire, supprimer votre entité, ajouter votre entité et ajouter la contrainte de clé primaire. Cependant, vous ne pouvez pas supprimer les contraintes de clé primaire lorsque les FK le référencent. Ce que vous faites semble être une mauvaise idée. Ne pouvez-vous pas simplement modifier l'objet existant avec les données du nouvel objet? – Pakman

Répondre

2

Vous devez effectuer deux appels SaveChanges() pour que cela fonctionne. Le problème ici est que, bien qu'il semble que vous supprimiez d'abord l'enregistrement et que vous en ajoutiez un nouveau, le framework fait d'abord l'insertion. La raison en est que Entity Framework ne vous donne pas un contrôle granulaire sur les ordres dans lesquels les opérations se déroulent. Donc votre meilleur pari sera d'envelopper les deux dans TransactionScope qui vous permettra de contrôler les transactions individuelles qui sont survenant.

Vous pouvez en lire plus ici: https://blogs.msdn.microsoft.com/alexj/2009/01/11/savechangesfalse/

+0

Réponse similaire avec l'exemple de transaction https://stackoverflow.com/questions/2600688/clear-an-entitycollection-and-then-add-to-it-within-the-same-transaction-doesnt/2601143#2601143 –

2

Une déclaration de mise à jour unique peut travailler pour vous si la solution est de mise à jour l'ancienne entité avec les nouvelles valeurs de l'entité, si vous voulez garder la même valeur de clé primaire . Lorsque la clé primaire identifie une entité, la suppression de l'ancienne et l'ajout d'une nouvelle à la place auront le même effet que la mise à jour. Corrige-moi si tu sens que j'ai tort, en me donnant un exemple parfait.