2014-02-06 14 views
3

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

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

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 не заполнен. Но идентификатор владельца правильно установлен в базе данных, и запрос выглядит нормально. Запросы, выполняемые во время теста и запуска приложения, кажутся одинаковыми.

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

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

ответ

8

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

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

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

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

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

+0

Спасибо Стив. Это действительно помогло решить эту проблему. Однако я немного смущен тем, почему мои интеграционные тесты (которые вызывают методы на контроллере) работают и имеют полные населенные объекты. Это из-за времени жизни контекста? Я думаю, что мои тесты создают контекст для срока службы теста, который может быть несколькими вызовами метода контроллера, а при запуске в IIS SimpleInjector создаст DBC-текст для каждого вызова. Но dbcontext не должен был быть удален между загрузкой команды и перемещением владельца/членов. –

+0

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

+0

Будет ли сущность по-прежнему привязана к контексту, если она явно не была отсоединена? –

Смежные вопросы