2012-01-04 114 views
0

我有一个简单的建筑问题,并会喜欢一些建议。模型设计与实体框架

我想熟悉ASP.NET MVC 3.为此,我编写了一个小型电视节目库作为练习。

我的模型文件夹包含几个类,其中包括TvShowSeasonEpisode类。这些自然绑在一起:TvShow实例与Season实例具有一对多关系,而Season实例与Episode实例具有一对多关系。

使用ASP.NET的实体框架,我应该如何建模这些一对多关系?我看到2个选项:

  • 选项1 - 该TvShow类有一个List<Season> seasons
  • 选项2 - 该Season类有一个TvShow tvShow

选项2似乎更自然的我,因为它模仿底层的数据库设计。这也是微软在其MvcMusicStore教程中做出的选择。但是,我想知道是否有理由拒绝选项1--无论是针对数据库/ EF还是针对OO设计的事宜。

想法?

+0

TvShow当然有一个季节,而一个季节有一个列表? – 2012-01-19 00:40:09

回答

1

选项1和选项2实际上是兼容的;)使用实体框架时,有一种叫做navigation properties的东西,它允许在一对多关联的情况下具有这两者。

TvShow将有一个包含Seasons列表导航属性,并Season将包含关联TvShow导航属性。

+0

尽可能简单。那很棒!我使用的是代码优先的方法,所以我想我应该在模型中结合选项1和2? – guidupuy 2012-01-04 09:45:37

+0

另外,导航属性是否为“递归”,即是否可以将“TvShow”导航属性添加到“Episode”类中? – guidupuy 2012-01-04 09:49:11

+0

我个人从未使用过代码优先的方法,但使用这种方法使用导航属性应该很简单。见以下问题:http://stackoverflow.com/questions/4561079/entity-framework-ctp5-code-first-optional-navigation-property http://stackoverflow.com/questions/5534891/entity-framework-4- 1-code-first-keys-navigation-properties http://stackoverflow.com/questions/6144163/entity-framework-4-1-code-first-navigation-property-not-loading-when-only-the-i – ken2k 2012-01-04 09:50:02

0

如上所述,您应该同时使用两者。

不要忘记你操纵你的模型,它只是一个对象抽象,它并不代表它存储的方式。对于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)