Объектные объекты Entity Framework, не заполняющие

entity-framework entity-framework-6

Вопрос

У меня есть простая модель, которая, когда я запускаю веб-сайт в отладчике, структура сущности неправильно заполняет модель.

Модель проста:

public class Team
{
    /// <summary>
    ///     Constructor required for the EntityFramework to create the object.
    /// </summary>
    private Team()
    {            
    }

    public Team(string name, ApplicationUser owner)
    {
        Name = name;
        Owner = owner;
    }

    [Required]
    public int Id { get; private set; }

    [Required]
    public string Name { get; private set; }

    [Required]
    public ApplicationUser Owner { get; private set; }

    [Required]
    public List<TeamMembership> Members { get; set; }
}


public class TeamMembership
{
    /// <summary>
    ///     Constructor for the EntityFramework
    /// </summary>
    private TeamMembership()
    {
    }

    public TeamMembership(ApplicationUser user, MembershipStatus status)
    {
        User = user;
        Status = status;
    }

    [Required]
    public ApplicationUser User { get; private set; }

    [Required]
    public MembershipStatus Status { get; set; }

    [Required]
    public int Id { get; private set; }
}

Где ApplicationUser - это класс по умолчанию, созданный инфраструктурой членства ASP MVC 5.

Когда я запускаю свои тесты (Specflow), которые создают новую базу данных LocalDb с уникальным идентификатором для каждого теста и запускают миграции на этом db, структура сущности правильно заполняет мою команду и владельца.

Однако, когда я запускаю веб-сайт и пытаюсь взаимодействовать с приложением, моя команда не заполняется полностью, потому что владелец имеет значение null а Members не заполняются. Но идентификатор владельца правильно установлен в базе данных, и запрос выглядит нормально. Запросы, выполняемые во время теста и запуска приложения, кажутся одинаковыми.

Почему это может быть и как я могу начать отлаживать проблему?

Я чувствую, что мне не хватает чего-то простого.

Принятый ответ

Вероятно, вам нужно добавить .Include() к вашему запросу, который не указан в вашем вопросе, но должен выглядеть примерно так:

var query = context.Teams.Include(x => x.Owner).Include(x => x.Members).Where( ... );

EF будет загружать только объекты верхнего уровня, но не объекты, на которые он ссылается, пока они не понадобятся (ленивая загрузка). Если вы не выбрали контекст, просто попытка доступа к этим свойствам навигации должна заставить их загружаться из базы данных, но это не произойдет, если контекст был удален.

.Include() будет информировать EF о том, что эти свойства навигации должны быть загружены вместе с ссылочным объектом.

См. Эту страницу MSDN для более подробной информации о ленивой / нетерпеливой загрузке и о том, как ее контролировать.




Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему