2011-07-03 55 views
2

我有一個問題想出如何使EF 4.1代碼優先這項工作。我環顧四周,發現一個similar problem,但我無法讓它爲我工作,它聽起來像它沒有得到這個人的回答。EF 4.1代碼優先映射兩列在一張表中列出

下面是兩個對象的簡化版本。

public class Team 
{ 
    public int TeamId {get; set;} 
    public virtual IList<Game> Games {get; set;} 
} 

public class Game 
{ 
    public int GameId {get; set; } 
    public int AwayTeamId {get; set;} 
    public int HomeTeamId {get; set;} 

    public virtual Team HomeTeam { get; set; } 
    public virtual Team AwayTeam { get; set; } 
} 

這裏是我的註冊FKS代碼

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    modelBuilder.Entity<Game>() 
     .HasRequired(a => a.HomeTeam) 
     .WithMany() 
     .HasForeignKey(u => u.HomeTeamId).WillCascadeOnDelete(false); 

    modelBuilder.Entity<Game>() 
     .HasRequired(a => a.AwayTeam) 
     .WithMany() 
     .HasForeignKey(u => u.AwayTeamId).WillCascadeOnDelete(false); 
} 

我要帶回所有遊戲(在家或外出),一個團隊在不在。現在,EF正在打造一個TeamId列我的數據庫永遠不會被填充。如果我想要的是不可能的,那麼我可以列出HomeGames和AwayGames的列表,以及另一個是兩者結合的遊戲列表,但如果可能的話,我想盡量避免它。我仍然在學習這一點,所以任何額外的解釋或提示將不勝感激。

+0

這裏有一個類似的問題:http://stackoverflow.com/questions/6155953/ef-4-1-multiple-many-to-many-relationships-in-single-class/6156615#6156615基本上你自己的建議是正確的路要走。將一端的兩個端點映射到關聯另一端的單個端點是不可能的。 – Slauma

回答

0

EF無法將兩個關係映射爲單個導航屬性。您創建的額外TeamId列是因爲Games導航屬性被視爲單獨關係(您的映射表示HomeTeamAwayTeam都不是該關係的一部分),所以您指示EF爲您創建三個關係。

你必須定義你的模型是這樣的:

public class Team 
{ 
    public int TeamId {get; set;} 
    public virtual ICollection<Game> HomeGames { get; set; } 
    public virtual ICollection<Game> AwayGames { get; set; } 
} 

和映射必須是:

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    modelBuilder.Entity<Game>() 
     .HasRequired(a => a.HomeTeam) 
     .WithMany(t => t.HomeGames) 
     .HasForeignKey(u => u.HomeTeamId).WillCascadeOnDelete(false); 

    modelBuilder.Entity<Game>() 
     .HasRequired(a => a.AwayTeam) 
     .WithMany(t => t.AwayGames) 
     .HasForeignKey(u => u.AwayTeamId).WillCascadeOnDelete(false); 
} 

現在如果你想所有球隊的遊戲,你可以簡單地使用:

var games = team.HomeGames.Concat(team.AwayGames); 

您可以將其包裝到返回IEnumerable的方法中或僅返回的getter方法中。

+0

這正是我最終實現的代碼,一個名爲GetGames的屬性返回了IEnumerable的HomeGames和AwayGames組合。我很絆跌,因爲起初我使用IList而不是IEnumerable,它仍然在數據庫中創建TeamId列。一旦我將它切換到IEnumerable,該列停止回來。 – schwechel

1

你所要求的EF是一個只讀集合,即一個添加操作對於這樣一個集合是沒有意義的,因爲EF不知道要插入哪個表,我認爲這是不受支持的。

根據你的問題描述來判斷,我會和你自己的建議類似,並創建一個方法,比如GetGames(),它將只返回一組聯盟主客場比賽。無論如何,我認爲這在概念上更清潔。