Объектные объекты 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
Является ли этот КБ законным? Да, узнайте, почему