2017-10-10 1 views
3

Je dois implémenter une opération "shift par année" dans mon application Entity Framework.L'opération de mise à jour viole la contrainte unique

Pour simplifier les choses, supposons que j'ai une entité/table qui a une clé étrangère FK à une autre table et un AN (int, int). Les utilisateurs peuvent déplacer les années de l'entité vers l'avenir, j'ai donc besoin de copier les données de 2017 à 2018 et ainsi de suite.

Il existe une restriction dans la base de données stipulant que la paire (FK, YEAR) doit être unique.

Lorsque j'effectue le "décalage" en mémoire et envoie les modifications à la base de données avec SaveChanges Je reçois une erreur de la base de données que je viole la contrainte unique. Je suppose qu'il essaie d'effectuer la mise à jour ligne par ligne, donc la violation.

Si je trier la collection par année décroissante (donc aucun doublon n'arrive si les lignes sont envoyées une par une) la même erreur se produit.

Ma solution consiste à supprimer les anciennes données et insérer nouvelles données avec les nouvelles années, mais je pense qu'il pourrait y avoir une solution plus propre ...

+0

avez-vous essayé de désactiver cette contrainte en premier, en effectuant la mise à jour, puis en la réactivant? – AgapwIesu

+0

Vous devez définir 'identity insert' sur, faire l'opération et la désactiver à nouveau – DiskJunky

+0

Vous ne voulez pas avoir plusieurs lignes avec la même valeur' ID', en supposant que c'est aussi votre clé primaire. Si vous essayez d'ajouter un nouvel enregistrement au lieu de mettre à jour l'enregistrement existant, vous ne devriez jamais avoir le même 'ID', donc votre contrainte unique est probablement inutile puisque la valeur change toujours. Si à la place, vous mettez à jour cet enregistrement, vous avez quelque chose d'autre qui se passe. Nous aurons besoin de voir comment la table de base de données est définie et quel code vous utilisez pour effectuer votre ** shift ** et enregistrer. – krillgar

Répondre

0

Je résolu la question en inversant l'ordre et Enregistrement article par article après modification. Il n'est pas très simple d'exécuter autant de SaveChanges, mais le processus global est plutôt complexe et utilise des transactions, ce n'est donc pas une grosse affaire.

J'ai dû faire quelques changements parce que les utilisateurs peuvent passer des années au passé ou au futur, auquel cas je dois/ne dois pas inverser l'ordre, mais pour simplifier ce problème, disons que c'est résolu si je inverser la commande et enregistrer article par article.