2012-01-04 113 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)