Entity Framework не загружает связанные объекты
Я новичок в Entity Framework, но могу что-то неправильно понять или сделать что-то неправильно.
мой код, чтобы получить список задач для конкретного человека :
public List<TaskObject> GetAssignedTasks(int personId)
{
var items = (from s in _te.tasks where s.person.person_id == personId select s).ToList();
var tasks = new List<TaskObject>();
foreach (var t in items)
{
TaskObject tk = Transformer.UnpackTask(t);
tasks.Add(tk);
}
return tasks;
}
моя проблема в том, что он, похоже, возвращает список записей, но связанные элементы не загружаются. Мой Трансформер.Метод UnpackTask принимает объект задачи, который я загрузил, а затем преобразует его в другой объект, который поднимается до пользовательского интерфейса через бизнес/сервис слои.
но как только моя функция распаковки пытается ссылаться на элемент, который является связанным объектом (например, задача имеет "AssignedPerson", который имеет сущность Person с деталями person. Но свойство AssignedPerson моей сущности равно NULL. Я думал, что он загрузит связанные элементы.
Я неправильно понял?
3 ответов
вы должны явно включать ссылки с помощью метода Include (). Он имеет две перегрузки: один принимает свойство как лямбда-выражение, другой принимает путь для загрузки в виде строки (полезно, когда вам нужно загрузить ссылки на объекты, доступные в коллекциях).
попробуйте это. То, что мы пытаемся сделать здесь, это включить Связанный объект в сам запрос select, lazy load. Поэтому, когда вы распаковываете задачу, вы должны иметь возможность получить Связанный объект.
вещи для проверки:
- объект задачи должен иметь возможность просмотра для объекта person иначе это не сработает.
- добавьте ключевое слово [Include] поверх сущностей person внутри метаданных задачи в файле метаданных службы слой.
-- Е. Г. файл метаданных сервиса, который вы создали.
tasks metadata
{
...
...
\these two should already be there you will just have to add the Include and
\ Key attribute.
[Include]
public EntityCollection<Person> Person {get; set;}
[Key] \ that connects the task and person entity (FK/PK)
public int PersonID {get;set;}
}
файл
public List<TaskObject> GetAssignedTasks(int personId)
{
var items = (from s in _te.tasks.Include("Person") where s.person.person_id == personId select s).ToList();
var tasks = new List<TaskObject>();
foreach (var t in items)
{
TaskObject tk = Transformer.UnpackTask(t);
tasks.Add(tk);
}
return tasks;
}
надеюсь, что это помогает. Ура!--3-->
то, что вы ищете .Include
вы используете его так
var recordWithParentAttached = db.Tasks.Include(o => o.Person).Single(o => o.person_id == personId);
С .Include
ваши родители (или связанные записи) будут привязаны и переданы, а без них они будут nulls
.