2009-01-19 4 views
2

J'ai une table qui utilise trois colonnes comme clé composite.Modification de la valeur de clé composite à l'aide de LINQ

L'une de ces valeurs de colonne est utilisée comme suiveur de séquence pour les enregistrements associés ordonnés. Lorsque j'insère un nouvel enregistrement, je dois incrémenter les numéros de séquence pour les enregistrements liés qui viennent après le nouvel enregistrement.

Je peux le faire directement dans SQL Server Management Studio, mais lorsque je tente cela dans LINQ-je obtenir l'erreur suivante:

 
Value of member 'Sequence' of an object of type 'TableName' changed. 
A member defining the identity of the object cannot be changed. 
Consider adding a new object with new identity and deleting the existing one instead. 

Quelqu'un peut-il suggérer un moyen de contourner cette limitation?

(Ajout d'un nouveau record (tel que suggéré par le message d'erreur) n'est pas vraiment une option que la table avec la clé composite a une relation avec une autre table.)

+0

J'ai rencontré le même problème avec une base de données héritée. Bien sûr, c'est un mauvais design, mais on obtient ce qu'on nous donne parfois. J'ai utilisé la solution ci-dessous, créant un nouveau PK et restructurant la DB. La chose étrange est, la base de données elle-même met à jour bien, c'est LINQ qui jette un ajustement. – IanStallings

Répondre

3

Le correctif nous avons implémenté était comme suit

  • supprimé la relation qui a utilisé la clé composite
  • Ajouté champ ID autoincrement, définissez que la clé primaire
  • Ajouté contstraint unique aux trois domaines que nous utilisaient précédemment comme
  • Recréé la relation en utilisant les trois champs qui étaient précédemment notre clé primaire
+0

+1, mais c'est vraiment dommage que ce soit vraiment la seule façon d'y parvenir. –

4

Modification des clés primaires est une « odeur de code "dans mon livre.

+1

Bien sûr que oui. LINQ-to-SQL, cependant, semble nous dire que c'est impossible. –

0

Je pense que le compilateur a raison. La seule façon de le faire est de créer un nouvel enregistrement et de supprimer l'ancien.

(Adding a new record (as suggested by the error message) isn't really an option as the table with the composite key has a relationship with another table.)

Je pense qu'il n'y a pas de problème avec cela. Il suffit de copier tous les champs de votre entité, définir la nouvelle séquence , et définir également une relation en attribuant simplement l'ancienne référence EntitySet au nouveau. J'ai essayé ceci et il met à jour correctement. En dehors de cela, ne pourriez-vous pas simplement créer une nouvelle colonne ID avec incrémentation automatique? Je suis d'accord avec @ocdecio. Je pense que la modification des clés primaires est mauvaise conception ...

0

Je ne sais pas LINQ, mais cela fonctionnerait-il si vous avez une mise à jour en cascade définie sur le serveur SQL pour les relations FK? Mind, je pense que l'utilisation d'une clé composite est une mauvaise idée et en changer est une pire idée. La clé primaire ne devrait pas changer. Trop de choses peuvent se casser si la clé primaire change. Et que faites-vous lorsque la clé primaire change et qu'elle n'est plus unique? Si vous faites cela, vous aurez besoin d'un moyen de gérer cela aussi parce que cela arrivera.

+0

J'ai une mise à jour en cascade définie sur la relation –

1

J'ai travaillé autour de cela en utilisant un proc stocké SQL pour mettre à jour l'une des clés primaires et en l'appelant à partir de LINQ.

Questions connexes