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 (). Он имеет две перегрузки: один принимает свойство как лямбда-выражение, другой принимает путь для загрузки в виде строки (полезно, когда вам нужно загрузить ссылки на объекты, доступные в коллекциях).

MSDN reference


попробуйте это. То, что мы пытаемся сделать здесь, это включить Связанный объект в сам запрос 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.