Дизайн модели с Entity Framework - PullRequest
0 голосов
/ 04 января 2012

У меня простой архитектурный вопрос, и я хотел бы получить несколько советов.

Я пытаюсь ознакомиться с ASP.NET MVC 3. Для этого я пишу небольшую галерею ТВ-шоу в качестве упражнения.

Папка «Мои модели» содержит несколько классов, включая классы TvShow, Season и Episode.Они естественно связаны между собой: экземпляр TvShow имеет отношение один ко многим с экземплярами Season, а экземпляр Season имеет отношение один ко многим с экземплярами Episode.

Используя Entity Framework ASP.NET, как мне моделировать эти отношения «один ко многим»?Я вижу 2 варианта:

  • Опция 1 - класс TvShow имеет поле List<Season> seasons
  • Опция 2 - класс Season имеет поле TvShow tvShow

Вариант 2 кажется мне более естественным, поскольку он имитирует структуру базы данных.Это также выбор, сделанный Microsoft в их учебнике MvcMusicStore.Однако мне интересно, есть ли причина отклонить вариант 1 - либо по вопросам, связанным с базой данных / EF, либо по вопросам проектирования ОО.

Мысли?

Ответы [ 2 ]

1 голос
/ 04 января 2012

Вариант 1 и Вариант 2 на самом деле совместимы;) В Entity Framework есть то, что называется навигационные свойства , что позволяет иметь оба в случае ассоциации один-ко-многим.

TvShow будет иметь свойство навигации, которое содержит список Seasons, а Season будет иметь свойство навигации, которое содержит связанный TvShow.

0 голосов
/ 19 января 2012

Как сказал, вы должны использовать оба.

Не забывайте, что вы манипулируете своей моделью и что это только абстракция объекта, а не то, как она хранится. Для TvShow естественно иметь свойство со списком сезонов, а для одного сезона - свойство, которое ссылается на родительский TvShow.

Единственная важная вещь, которую нужно знать в этих отношениях, это кто является хозяином, ответственным за обновление.

у вас должно быть что-то подобное:

public class TvShow
{
   public int Id {get;set;}
   public virtual ICollection<Season> Seasons {get;set;}
}

public class Season
{
   public int Id {get;set;}
   public int TvShowId {get;set;}
   public virtual TvShow Show {get;set;}
}

Тогда вам следует помочь вашему сопоставлению с файлом конфигурации:

public class SeasonConfiguration : EntityTypeConfiguration<Season>
{
    internal SeasonConfiguration()
    {
        this.HasRequired(s => s.Show)
            .WithMany(tv => tv.Seasons)
            .HasForeignKey(s => s.TvShowId);
    }
}

Семантика не самая естественная, но работает так.

И если вы изучаете ASP.NET MVC, не забывайте, что то, что вы определяете здесь, это ваша модель и ваше отображение, оно должно отличаться от того, что вы хотите использовать в своих представлениях (то есть: ViewModel)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...