我有一个简单的架构问题,并且会喜欢一些建议。
我正在尝试熟悉ASP.NET MVC 3.为此,我正在编写一个小型电视节目库作为练习。
我的模型文件夹包含多个类,包括TvShow
,Season
和Episode
类。这些实际上是捆绑在一起的:TvShow
实例与Season
实例具有一对多关系,而Season
实例与Episode
实例具有一对多关系实例
使用ASP.NET的实体框架,我应该如何建模这些一对多的关系?我看到两个选项:
TvShow
类有List<Season> seasons
字段Season
类有TvShow tvShow
字段选项2对我来说似乎更自然,因为它模仿了底层的数据库设计。它也是Microsoft在MvcMusicStore教程中做出的选择。但是,我想知道是否有理由拒绝选项1 - 无论是数据库/ EF相关事宜还是OO设计事宜。
思想?
答案 0 :(得分:1)
选项1和选项2实际上是兼容的;)使用实体框架,有一个名为navigation properties的东西,允许在一对多关联的情况下同时使用它们。
TvShow
将包含一个包含Seasons
列表的导航属性,Season
将包含一个包含相关TvShow
的导航属性。
答案 1 :(得分: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)