Как правильно использовать EF4 Navigation Properties?
Я создал базу данных, используя подход модели EF4. В моей модели есть отношение N-to-M между двумя объектами:
Я заполнил свою базу данных фиктивными данными, включая 3 записи типа Diagnosis
и 3 записи типа TreatmentSchema
и ассоциации между ними. Вот фрагмент кода, который я использовал для этого:
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();
}
Я проверил, что ассоциации действительно хранятся в справочной таблице, созданной с помощью сопоставления EF4. Тем не менее, когда я получаю Diagnosis
через container.Diagnoses
коллекция позже, его .TreatmentSchemas
Коллекция всегда пуста.
Я попытался отладить код, сгенерированный EF4, и все, что он делает, это лениво создает указанную коллекцию, но она не заполняет ее связанными объектами. Entity Framework Profiler в Ayende не показывает никаких запросов, генерируемых при обращении к свойству, что заставляет меня поверить, что я здесь что-то не так делаю.
Как я могу получить список связанных TreatmentSchemas
?
1 ответ
Свойства навигации не загружаются по умолчанию. Вы должны использовать либо готовую загрузку, либо ленивую загрузку, но поскольку вы используете самопроверяющиеся объекты, ваш выбор - только нетерпеливая загрузка, потому что STE не поддерживают отложенную загрузку. Поэтому, если вы хотите получить экземпляр Diagonstic со всеми связанными с ним обращениями, вы должны вызвать:
var diagnosis = context.Diagnoses.Include("TreatmentSchemas").FirstOrDefault();