2011-03-17 57 views
1

我在這裏有點遺憾。特定實體框架代碼首先多到2個模型映射

基本上我有兩個型號:

public class Player 
{ 
    public int PlayerId { get; set; } 
    public string Name { get; set; } 

    public virtual ICollection<Game> Games { get; set; } 
} 

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

    public virtual Player PlayerBlack { get; set; } 
    public virtual Player PlayerWhite { get; set; } 
} 

現在的數據庫模式,EF代碼首先創建對我來說,是不正確的,因爲遊戲桌得3個外鍵(Playerblack,PlayerWhite和播放器),而不是2.

所以,我怎麼可以配合這些模型在一起,使EF的理解是,玩家遊戲目前無論是着眼於黑色或白色Player中找到。

基本上每次我打電話myPlayer.Games EF必須查看PlayerBlack和PlayerWhite外鍵。

這有可能嗎?

+0

BTW http://stackoverflow.com/questions/5067688/entity-framework-ctp5-code-first-mapping-a- class-with-multiple-collections-of-an雖然你想將兩個引用映射到一個集合,但我正在尋找將兩個集合映射到一個引用。 – Slauma 2011-03-17 19:43:41

回答

1

我相信這是不可能的。您不能與一方的單個端點和另一方的兩個端點建立關聯。

可能的解決方法:

  • 使用兩個集合的Player類:

    public virtual ICollection<Game> GamesAsBlackPlayer { get; set; } 
    public virtual ICollection<Game> GamesAsWhitePlayer { get; set; } 
    

    根據您的環境下,你可以將這些藏品可能合併到一起,以一個只讀集合Games它沒有映射到數據庫。

(編輯:擬定第二個解決方法是廢話,現在刪除。)

EDIT2:另一個workarund可能是通過一個附加的類PlayerInGame要擴展類模型:

public class Player 
{ 
    public int PlayerId { get; set; } 
    public string Name { get; set; } 

    public virtual ICollection<PlayerInGame> PlayerInGames { get; set; } 

    // optional helper property 
    [NotMapped] 
    public IEnumerable<Game> Games 
    { 
     get 
     { 
      return PlayerInGames.Select(g => g.Game); 
     } 
    } 
} 

public class Game 
{ 
    public int GameId { get; set; } 
    public virtual ICollection<PlayerInGame> PlayersInGame { get; set; } 

    [NotMapped] 
    public Player PlayerBlack 
    { 
     get 
     { 
      return PlayersInGame.Single(p => p.WhiteOrBlack == "B").Player; 
     } 
    } 

    [NotMapped] 
    public Player PlayerWhite 
    { 
     get 
     { 
      return PlayersInGame.Single(p => p.WhiteOrBlack == "W").Player; 
     } 
    } 
} 

public class PlayerInGame 
{ 
    public int PlayerInGameId { get; set; } 

    public virtual Game Game { get; set; } 
    public virtual Player Player { get; set; } 
    public string WhiteOrBlack { get; set; } 
} 

正如你可以通過Single方法在PlayerBlackPlayerWhite性能在Game類看你必須確保你的業務邏輯來創建正確的PlayerInGame實體,從而使您的PlayersInGame集合總是分別帶有黑色或白色標誌的兩個元素。

+1

感謝您的回答。我把你的第一個想法,並獲得所有的遊戲:公共IEnumerable 遊戲{獲得{返回GamesAsBlackPlayer.Concat(GamesAsWhitePlayer).ToList(); }}' – Alex 2011-03-18 22:54:04

+0

啊,Concat!我甚至不知道這種方法存在。 (我有一個名單上的「AddRange」,但Concat似乎更通用,很好!) – Slauma 2011-03-18 23:52:31

-1

我想解決這樣的問題:在這裏類似的問題:

public abstract class Player 
{ 
    public int ID { get; set; } 
} 

public class WhitePlayer : Player 
{ 
} 

public class BlackPlayer : Player 
{ 
} 

public class Game 
{ 
    public int ID { get; set; } 

    public virtual WhitePlayer WhitePlayer { get; set; } 
    public virtual BlackPlayer BlackPlayer { get; set; } 
} 

public class GamePlayerContext : DbContext 
{ 
    public DbSet<Game> Games { get; set; } 
    public DbSet<Player> Players { get; set; } 
} 
+0

您的解決方案不正確,因爲同一個玩家有時會變黑,有時會變成白色。一個對象不能改變它的類型。 – 2011-03-20 20:50:11