具有实体框架的模型设计

时间:2012-01-04 09:28:38

标签: c# asp.net-mvc-3 entity-framework architecture

我有一个简单的架构问题,并且会喜欢一些建议。

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

我的模型文件夹包含多个类,包括TvShowSeasonEpisode类。这些实际上是捆绑在一起的:TvShow实例与Season实例具有一对多关系,而Season实例与Episode实例具有一对多关系实例

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

  • 选项1 - TvShow类有List<Season> seasons字段
  • 选项2 - Season类有TvShow tvShow字段

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

思想?

2 个答案:

答案 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)