2009-03-25 8 views
0

J'ai récemment lu le livre de Louis Davidson sur Sql Server Database Design et l'ai trouvé très instructif. J'ai ramassé beaucoup de concepts que je ne connaissais pas beaucoup auparavant (ou quoi que ce soit). Principalement - j'ai choisi un moyen de mettre en place des relations de bases de données que je n'avais jamais essayées auparavant.Linq to Sql et Non-PK, problèmes de relation FK uniques

Fondamentalement, vous utilisez une clé de substitution en tant que tables PK (un champ id incrémenté automatiquement), puis configurez une ou plusieurs clés alternatives consistant en une ou plusieurs clés uniques. Ces kays alternatifs seraient alors les valeurs utilisées pour les relations (ou le PK, si cela a plus de sens pour la relation donnée).

J'ai remodelé une ancienne base de données qui souffrait de certaines incohérences de données en raison d'une mauvaise conception pour mettre en œuvre cela, à mon avis, une nouvelle façon de penser.

Au niveau de la base de données, cela fonctionne très bien. Les relations fonctionnent comme elles sont supposées le faire et les contraintes sont appliquées de manière cohérente et fiable.

CEPENDANT

Je ne peux pas le faire fonctionner correctement soit dans le Entity Framework ou LINQ aux classes Sql. J'ai lu que dans V1 de EF, il ne suffit pas de soutenir ce type de relation - donc je suis passé à Linq à Sql pour voir si les choses iraient mieux. Ils ont apparemment fait, comme je l'ai fait toutes les relations automatiquement mappé lorsque j'ai importé les classes de ma base de données. Le problème est que je ne peux pas enregistrer les données dans la base de données à cause des exceptions InvalidCastOperation dès que j'essaie d'enregistrer des données.

J'ai donc quelques questions:

  1. Est-ce une limitation dans LINQ to SQL?
  2. Si oui, y a-t-il un moyen de contourner le ? Préférablement sans mettre en œuvre sprocs pour enregistrer, mettre à jour et supprimer - le type de sécurité est quelque chose que je voudrais à conserver.
  3. Est-ce que cette manière de concevoir des relations de base de données est "correcte" et/ou une bonne pratique?

J'espère que quelqu'un peut faire la lumière sur cela, car je suis assez frustré à ce sujet. Je ne peux pas vraiment trouver de bon matériel sur le sujet en ligne - alors j'espère que quelqu'un ici a une réponse ou peut me diriger dans la bonne direction.

Merci beaucoup!

EDIT - Solution. Ce que j'ai fini par faire était ceci - je suis revenu à l'aide de l'Entity Framework en même temps qu'une refonte du schéma de base de données. J'ai remodelé les relations pour s'appuyer sur des clés primaires plutôt que sur des clés alternatives, dans la plupart des cas. Lorsque ce n'était pas une option - j'ai fait quelques modifications à la disposition EF. J'ai mis en place la relation qui reposait sur les AK - à laquelle EF se plaint. Pour contourner le problème, j'ai dû supprimer la propriété de clé étrangère du côté de la relation, point auquel EF accepte la relation.

+0

Je n'ai pas fait face à quelque chose comme ça, mais je ne me souviens pas si j'ai utilisé ce type de relations. Etes-vous absolument certain qu'il est causé par la relation, avez-vous réessayé de reproduire dans un scénario simple? – eglasius

+0

Je ne peux pas être 100% positif, puisque je ne peux pas intervenir dans l'opération ctx.SubmitChanges() pour voir exactement où il échoue. J'ai exécuté une trace de serveur Sql cependant, et j'ai conclu qu'aucune demande n'a été envoyée - ainsi elle échoue du côté de client avant qu'aucune communication soit envoyée à la base de données. – Ciddan

+0

Pouvez-vous publier l'exception complète, y compris la trace de la pile? Peut-être qu'il contient des informations utiles. – laktak

Répondre

0

1) Oui.

2) Si vous pouvez marquer votre clé alternative comme primaire dans le modèle L2S et que vous marquez le PK réel comme PK, cela fonctionnera.

3) Du point de vue db, il n'y a rien de mal, mais comme vous l'avez remarqué, il n'est pas supporté par L2S ou EF. Personnellement, je préfère toujours avoir des FK pointant vers le PK et n'utiliser que des AK pour les recherches.