0

J'ai créé une base de données en utilisant l'approche modèle EF4. Dans mon modèle, il y a une relation N-à-M entre deux entités:Comment utiliser correctement les propriétés de navigation EF4?

enter image description here

J'ai rempli ma base de données avec des données factices, dont 3 enregistrements de type Diagnosis et 3 enregistrements de type TreatmentSchema et associations entre eux. Voici l'extrait de code que je faisais ceci:

using(var container = new SmartTherapyContainer()) { 
    var diagnosisA = new Diagnosis() { Id = Guid.NewGuid(), Name = "Diagnosis A" }; 
    var diagnosisB = new Diagnosis() { Id = Guid.NewGuid(), Name = "Diagnosis B" }; 
    var diagnosisC = new Diagnosis() { Id = Guid.NewGuid(), Name = "Diagnosis C" }; 
    container.Diagnoses.AddObject(diagnosisA); 
    container.Diagnoses.AddObject(diagnosisB); 
    container.Diagnoses.AddObject(diagnosisC); 

    var schemaA = new TreatmentSchema() { Id = Guid.NewGuid(), Name = "Schema 1" }; 
    var schemaB = new TreatmentSchema() { Id = Guid.NewGuid(), Name = "Schema 1" }; 
    var schemaC = new TreatmentSchema() { Id = Guid.NewGuid(), Name = "Schema 1" }; 
    container.Schemas.AddObject(diagnosisA); 
    container.Schemas.AddObject(diagnosisB); 
    container.Schemas.AddObject(diagnosisC); 

    diagnosisB.TreatmentSchemas.Add(schemaA); 
    diagnosisC.TreatmentSchemas.Add(schemaA); 
    diagnosisC.TreatmentSchemas.Add(schemaB); 
    diagnosisC.TreatmentSchemas.Add(schemaC); 

    container.SaveChanges(); 
} 

Je vérifiais que les associations sont en effet stockées dans la table de référence créée par la cartographie de EF4. Toutefois, lorsque je récupère un Diagnosis via la collection container.Diagnoses ultérieurement, sa collection .TreatmentSchemas est toujours vide.

J'ai essayé de déboguer dans le code généré par EF4 et tout ce qu'il fait est de créer paresseusement la dite collection, mais elle ne la remplit pas avec les objets associés. Le Entity Framework Profiler d'Ayende ne montre aucune requête générée lors de l'accès à la propriété, ce qui me porte à croire que je fais quelque chose de mal ici.

Comment puis-je obtenir une liste des TreatmentSchemas associés?

+0

Dans le cas où il est pertinent, j'utilise le « Self-entité de référence du générateur » pour générer le code pour mon modèle EF4. – Cygon

Répondre

2

Les propriétés de navigation ne sont pas chargées par défaut. Vous devez utiliser soit le chargement impatient ou le chargement paresseux, mais parce que vous utilisez des entités de suivi automatique, votre choix est seulement le chargement impatient, car STEs don't support lazy loading. Donc, si vous voulez obtenir par exemple avec tous les TreatmentSchemas diagnostiques liés, vous devez appeler:

var diagnosis = context.Diagnoses.Include("TreatmentSchemas").FirstOrDefault(); 
+0

Merci! Se référer au nom de la table dans une chaîne est un peu refactoring-hostile, peut-être que je peux contourner cela en ajoutant une méthode explicite à mon service. Il est bon de connaître cette limitation, qui m'aurait coûté plus tard des maux de tête :) – Cygon

+0

Si vous n'aimez pas utiliser Include avec le nom de propriété de navigation chech EF 4.1 car il a une version fortement typée avec lambdas. –

Questions connexes