2010-07-08 5 views
2

Je travaille avec un peu d'une base de données existante, mais voici l'idée de base:Linq 2 SQL, ne peut pas créer une association

Item 
Id INT PK NOT NULL 
Description VARCHAR(50) NOT NULL 
TranslationId INT NULLABLE 

Translation 
Id INT PK NOT NULL 
Language VARCHAR(10) PK NOT NULL 
Translation VARCHAR(50) NOT NULL 

En principe, chaque article peut avoir plusieurs traductions, semble assez simple. Ces tables n'ont pas de clés étrangères, donc j'essaie manuellement de créer l'association dans DBML, mais elle échoue en raison de la différence NULL entre translationID et PK dans la table Translation.

Y at-il de toute façon je peux obtenir cette association à travailler, par exemple:

item.Translations 

Message d'erreur: Impossible de créer une association "Item_Translation". Les propriétés n'ont pas de type correspondant: "TranslationId", "Id".

Je sais que cela a à voir avec TranslationId étant nullable parce qu'une autre table avec une association à Translations fonctionne correctement, mais sa colonne TranslationId n'est pas NULL.

données Exemples de traduction:

Id Language Translation 
1 en-us some text 
1 en-gb some text 
2 en-us some text 
2 en-gb some text 

Répondre

2

Actuellement, vous avez ce mis en place afin qu'une traduction peut avoir de nombreux articles, et non pas la façon dont vous indiquer où un élément peut avoir de nombreuses traductions. Pour corriger cela, vous avez besoin d'un itemId dans votre table Translation, et de supprimer le translationId de votre table Item. Une fois que vous avez pris cela en charge, si vous rencontrez des problèmes, s'il vous plaît poster le message d'erreur que vous obtenez.

EDIT:

LINQ 2 SQL ne se construit pas à reconnaître ce que vous essayez de faire. Lorsque vous créez une clé étrangère, vous pouvez le dire en mots, le parent a beaucoup d'enfants. Le parent a la clé primaire, et la table enfant a le pointeur vers cette clé primaire (la clé étrangère). Comment vous avez mis en place est le contraire. Dans votre cas, vous ne liez pas la clé primaire complète, mais plutôt une partie de la clé primaire qui fournit suffisamment d'informations pour inverser la relation.

Je comprends votre problème avec la nécessité de lier la table de traduction à partir de plusieurs tables, donc je recommanderais normalement une refonte ici. Comme il semble faire ce que vous cherchez, je vais enregistrer cela pour un autre fil. Ma suggestion est d'ajouter votre propre propriété aux classes et de supprimer l'association dans le concepteur.

Vous pouvez faire un clic droit partout dans le concepteur et choisissez Afficher le code, puis il suffit d'ajouter manuellement la propriété:

namespace MyNamespace 
{ 
   // put your using statements inside the namespace for this file!!! 

   partial class Item 
   { 
       public IQueryable<Translation> Translations 
       { 
           MyDataContext dc = new MyDataContext(); 
           return dc.Translations.Where(t => t.Id == this.translationId); 
       } 
   } 
} 
+0

Désolé, je fait une erreur dans mon post original, à la fois Id et la langue de la table de traduction sont des PK. De plus, plusieurs tables se réfèrent à ce tableau pour leurs traductions. –

+0

Néanmoins, cela n'a pas de sens que l'association échoue à cause de la différence NULL. Les clés étrangères sont autorisées à être nulles, cela signifie simplement que l'élément n'a pas de traduction. Pouvez-vous poster le message d'erreur exact que vous obtenez? –

+0

Je dois mentionner, il n'a pas de sens d'avoir une valeur unique 'Translation.Id' pas la clé primaire complète quand elle suffira à elle seule. Les clés étrangères sur la base de données ne seraient pas en mesure de lier directement à l'ID, vous devrez également inclure la langue.Je ne suis pas sûr si cela a quelque chose à voir avec le problème LINQ 2 SQL cependant. Le message d'erreur exact aiderait grandement. –

Questions connexes