2011-04-05 90 views
0

我目前正在測試EntityFramework 4.1。使用EntityFramework時出現關聯問題

我的問題是,我有一個團隊類和一個遊戲類。

class Team { 
    string Name { get; set; } 
} 

class Game { 
    Team HomeTeam { get; set; } 
    Team AwayTeam { get; set; } 
} 

還沒有找到一種方法來映射此。我已經設法使用NHibernate,但沒有與EF的運氣。任何指針?

回答

1

這是乾淨的地圖我:

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     modelBuilder.Entity<Team>().HasKey(t => t.Name); 

     modelBuilder.Entity<Game>().HasKey(
         g => new { g.AwayTeamName, g.HomeTeamName }); 

     modelBuilder.Entity<Game>() 
         .HasRequired(g => g.HomeTeam) 
         .WithMany() 
         .HasForeignKey(g => g.HomeTeamName) 
         .WillCascadeOnDelete(true); 

     modelBuilder.Entity<Game>() 
         .HasRequired(g => g.AwayTeam) 
         .WithMany() 
         .HasForeignKey(g => g.AwayTeamName) 
         .WillCascadeOnDelete(false); 

     base.OnModelCreating(modelBuilder); 
    } 

請注意,你不能既級聯PK/FK關係。如果你在NHib中取得成功,你會知道級聯兩者都會導致循環。


編輯:我想我應該有我的波蘇斯:

public class Team 
{ 
    public string Name { get; set; } 
} 

public class Game 
{ 
    internal string HomeTeamName { get; set; } 
    public Team HomeTeam { get; set; } 

    internal string AwayTeamName { get; set; } 
    public Team AwayTeam { get; set; } 
} 

注意,您必須有某種關鍵的您波蘇斯,因此需要對HomeTeamName和AwayTeamName。如果您想將其隱藏在使用代碼中,則可以將它們保留在內部。

+0

我在遊戲和團隊中使用了Id ...並使用了HomeTeamId和AwayTeamId。不過,謝謝。 只有一個問題,通過使用這個我不允許有一個遊戲與HomeTeam和AwayTeam相同嗎?因爲我將HomeTeamName和AwayTeamName設置爲遊戲的關鍵字。 – 2011-04-07 19:40:01

+0

在上面的代碼中沒有任何東西可以阻止你使主隊和客隊相同。您需要爲您的POCO或系統中的其他層添加驗證邏輯。 – anon 2011-04-08 02:51:19