Как сначала работать со свойствами навигации (/ внешними ключами) в коде ASP.NET MVC 3 и EF 4.1 - PullRequest
1 голос
/ 29 марта 2011

Сначала я начал тестировать «рабочий процесс» с кодом EF.
Сначала я создал диаграмму классов. Разработано несколько классов - вы можете увидеть диаграмму классов здесь
Затем я использовал EF Code First, создал EntsContext ..

    public class EntsContext : DbContext
    {
        public DbSet<Project> Projects { get; set; }
        public DbSet<Phase> Phases { get; set; }
        public DbSet<Iteration> Iterations { get; set; }
        public DbSet<Task> Tasks { get; set; }
        public DbSet<Member> Members { get; set; }
    }

Следующим шагом было создание ProjectController (ASP.NET MVC3) с простым действием:

public ActionResult Index()
{
    using (var db = new EntsContext())
    {
        return View(db.Projects.ToList());
    }
}

Проблема в том, что я не вижу ProjectManager (используется список / создание скаффолдинга). Я хотел бы знать, если я делаю это неправильно, или генерация лесов просто игнорирует мои свойства, которые не являются базовыми типами.
Хм ... Это, вероятно, совершенно очевидно ... потому что генератор не знает, какое свойство этого типа следует использовать, верно?

Что ж, тогда я мог бы немного изменить свой вопрос: каков надежный способ создания объекта Project в этом сценарии (я хочу выбрать менеджера проекта во время создания проекта)? Должен ли я сделать ViewModel для этого?

Ответы [ 2 ]

3 голосов
/ 29 марта 2011

ProjectManager не будет загружен по умолчанию. Вы должны использовать либо ленивую загрузку, либо нетерпеливую загрузку. Стремительная загрузка загрузит ProjectManager, когда вы запросите Projects:

public ActionResult Index()
{
    using (var db = new EntsContext())
    {
        return View(db.Projects.Include(p => p.ProjectManager).ToList());
    }
}

Ленивая загрузка загрузит ProjectManager, как только свойство будет доступно в представлении. Чтобы разрешить отложенную загрузку, вы должны создать все свои свойства навигации как virtual, но в вашем текущем сценарии это не очень хорошая оценка, потому что:

  • Ленивая загрузка требует открытого контекста. Вы закрываете контекст перед отображением представления, чтобы получить исключение из удаленного контекста.
  • Ленивая загрузка в вашем случае приводит к N + 1 запросам к БД, где N - количество проектов, потому что каждый менеджер проекта будет запрашиваться отдельно.
0 голосов
/ 29 марта 2011

Полагаю, вам понадобится класс ProjectManager, а у вашей сущности Project должно быть свойство, указывающее на класс ProjectManager.

Что-то вроде:

public class Project
{
   public string Description {get; set;}
   public Member ProjectManager {get; set;}
}
...