Question

Je travaille avec quelques tables héritées qui ont des relations, mais ces relations n'ont pas été explicitement définies en tant que clés primaires / étrangères. J'ai créé un fichier .dbml en utilisant " Classes Linq To Sql " et a établi l'association appropriée Case.CaseID = CaseInfo.CaseID. Ma classe résultante est CasesDataContext.

Mes tables (une à plusieurs):

Case
------------------
CaseID (int not null)
MetaColumn1 (varchar)
MetaColumn2 (varchar)
MetaColumn3 (varchar)
...


CaseInfo
------------------
CaseInfoID (int)
CaseID (int nulls allowed)
CaseInfoMeta (varchar)
...

Je suis nouveau sur LinqToSQL et j'ai du mal à le faire ..

CasesDataContext db = new CasesDataContext();
var Cases = from c in db.Cases
            where c.CaseInfo.CaseInfoMeta == "some value"
            select c;

(Edit) Mon problème étant que CaseInfo ou CaseInfos n'est pas disponible en tant que membre de Cases.

Un collègue m'a dit que je pourrais essayer ADO.Net Entity Data Model pour créer ma classe de contexte de données, mais je ne l'ai pas encore essayé et je voulais voir si je perdrais mon temps ou si je devais changer de voie. . Des conseils, des liens, de l’aide seraient les bienvenus.

Était-ce utile?

La solution

Retournez au concepteur et vérifiez que la relation est correctement configurée. Voici un exemple concret, avec BillStateMasters, " CustomerMasters1 " propriété (clients pour l'état): alt text

Ps. les noms sont en train d'être nettoyés ...

Mise à jour 1: vous devez également vous assurer que les deux tables ont un primaire défini. Si la clé primaire n'est pas définie dans la base de données (et ne peut pas être définie pour une raison quelconque), assurez-vous de la définir dans le concepteur. Ouvrez les propriétés de la colonne et définissez-la en tant que clé primaire. Cela dit, le suivi des entités ne fonctionnera pas non plus si vous n'avez pas de clé primaire pour l'entité, ce qui signifie que supprime signifie qu'elle ne met pas à jour l'entité en silence. Veillez donc à examiner toutes les entités et à les avoir toutes avec une clé primaire (comme je l’ai dit, si cela ne peut pas être sur la base de données, puis sur le concepteur).

Autres conseils

CasesDataContext db = new CasesDataContext();
var Cases = from c in db.Cases
            join ci in db.CaseInfo on
            ci.ID equals c.InfoID
            where ci.CaseInfoMeta == "some value"
            select new {CASE=c, INFO=ci};

mon " rejoindre " linq est un peu rouillé, mais ce qui précède devrait se rapprocher de ce que vous recherchez.

L’association est-elle définie sur One to One ou One to Many? Si l'association est définie sur Un à plusieurs, il s'agit d'un EntitySet et non d'un EntityRef. Vous devez utiliser une clause where sur le jeu dépendant pour obtenir la valeur correcte. Je suppose que vous souhaitez une relation un à un, ce qui n’est pas la relation par défaut. Essayez de la remplacer par One to One et voyez si vous pouvez construire la requête.

Remarque: je suis en train de deviner, car vous ne nous avez pas dit ce que le "problème" a rencontré. est en fait.

Votre requête semble correcte et doit renvoyer un ensemble de résultats de requête d'objets Case.

Alors ... quel est le problème?

  

(Edit) Mon problème étant que CaseInfo   n'est pas disponible dans les cas ... c'est-à-dire   CasInfo n'existe pas où je suis   en supposant que ce serait s'il y avait   clé primaire / étrangère explicite   relations.

Qu'entendez-vous par "non disponible"? Si vous avez créé l’association dans le concepteur comme vous le dites, la requête doit générer un code SQL similaire à

.
SELECT [columns] 
FROM Case INNER JOIN CaseInfo 
   ON Case.CaseID = CaseInfo.CaseID
WHERE CaseInfo.CaseInfoMeta = 'some value'

Avez-vous déjà débogué votre requête linq pour que le code SQL soit encore généré? Qu'est-ce qu'il retourne?

Quelques choses à essayer:

Vérifiez les propriétés de l'association. Assurez-vous que la propriété Parent a été créée en tant que public. Il le fait par défaut, mais quelque chose a peut-être changé.

Puisque vous n'obtenez pas CaseInfo sur C, essayez de taper dans l'autre sens pour voir si vous obtenez ci.Case avec intellisense.

Supprimez et recréez l'association dans son ensemble.

Il y a quelque chose de très grave qui ne va pas si les enfants membres ne se présentent pas. Il serait peut-être préférable de supprimer le dbml et de recréer le tout.

Si tout échoue, passez à NHibernate. :)

Après quelques tests, je suis presque sûr que les relations FK sont requises dans la base de données, quelles que soient les associations créées dans Linq-to-SQL. Autrement dit, si vous ne les avez pas explicitement définis dans la base de données, vous devrez effectuer une jointure manuellement.

Est-ce que c #? Je pense que vous avez besoin de == au lieu de = sur cette ligne:

where c.CaseInfo.CaseInfoMeta = "some value"

devrait lire

where c.CaseInfo.CaseInfoMeta == "some value"
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top