2010-06-03 6 views
3

J'ai une table composée d'une clé composite composée de deux champs int et d'un champ varchar (50). J'ai fait de la clé composite ma clé primaire, ce que je ne fais pas habituellement. Oui, oui, oui, je suis plus que familier avec la clé logique vs le débat clé substitut, mais j'ai dû faire des drogues lourdes (pas vraiment) le jour où j'ai fait la table depuis que je suis allé avec l'approche logique d'utiliser un substitut (ce que je fais presque toujours).Gestion pathétique des clés composites par LINQ

Mon problème: LINQ ne me permet pas de faire une mise à jour sur la colonne varchar (50) qui fait partie de la clé composite. Il lance l'exception "La propriété 'Value' fait partie des informations clés de l'objet et ne peut pas être modifiée." «Valeur» est le nom du champ (et s'il vous plaît ne me sermonnez pas en utilisant des mots réservés pour les noms de colonne ... comme je l'ai déjà dit, j'étais sous médicaments sérieux le jour de).

Alors, où est-ce que cela me laisse, d'ailleurs entre un rocher et un endroit difficile? La table en question possède réellement une colonne d'identité unique (même si ce n'est pas la clé primaire), et cette colonne est utilisée dans une clé étrangère à une autre table. Alors, bon sang, je ne peux pas très facilement faire un peu de piratage comme supprimer l'enregistrement en question et le rajouter, parce que cela me forcerait à garder la trace des fk dans d'autres tables et à les rajouter ensuite. Quel cauchemar ...

Quelqu'un connaît un moyen facile de contourner ce problème sans me forcer à apporter des changements importants à la structure de ma table?

Répondre

3

Si vous avez déjà une colonne IDENTITY unique sur cette table, alors elle devrait être votre clé primaire. Les clés primaires devraient toujours être un choix seulement entre les clés candidates (uniques) de taille minimale dans une table, et devraient presque toujours être immuables.

Vous n'avez même pas à faire de votre colonne IDENTITY la CLÉ PRINCIPALE sur la base de données, vous pouvez simplement en faire la colonne clé dans votre modèle Linq to SQL, et tout devrait fonctionner correctement.

0

Si vous essayez de mettre à jour une colonne qui forme une clé composite, je dirais que votre table est cassée de toute façon, et ce n'est pas LINQ qui est cassé. Dites à LINQ que votre colonne d'identité est votre clé ou utilisez un SPROC pour effectuer la mise à jour requise.

Questions connexes