实体框架6.1不会创建联结表

时间:2015-12-09 22:02:15

标签: c# entity-framework-6

作为一项学习练习,我正在尝试创建一个国际象棋网站。我正在使用Entity Framework 6.1来存储记录,而且我很难按照我的想法来创建迁移。

我希望能够检索玩家以及玩家玩过的所有游戏的列表。

public class Game
{
    public int Id { get; set; }
    // Other Properties
    public virtual Player White { get; protected set; }
    public virtual Player Black { get; protected set; }

    public Game(Player white, Player black) : this()
    {
        // Null checks

        White = white;
        Black = black;

        White.Games.Add(this);
        Black.Games.Add(this);
    }
}

public class Player
{
    public int Id { get; set; }
    // Other Properties
    public virtual ICollection<Game> Games { get; protected set; }

    protected Player()
    {
        Games = new Collection<Game>();
    }
}

然后我为每个设置了一个配置:

public class GameConfiguration : EntityTypeConfiguration<Game>
{
    ToTable("Games");

    HasRequired(x => x.White);
    HasRequired(x => x.Black);

    // Config for other Properties
}

public PlayerConfiguration : EntityTypeConfiguration<Player>
{
    ToTable("Players");

    HasMany(x => x.Games);

    // Config for other Properties
}

我希望迁移能够创建3个表:

  • 游戏:Id,White_Id,Black_Id,OtherProperties
  • 玩家:Id,OtherProperties
  • GamePlayer:Game_Id,Player_Id

但它创建了2个表:

  • 游戏:Id,White_Id,Black_Id,OtherProperties, Player_Id
  • 玩家:Id,OtherProperties

我可以理解,如果一个游戏只有一个玩家,那么将Player_Id列添加到游戏中,但游戏总共会有2个玩家。

在GameConfiguration中,我尝试过使用:

HasRequired(x => x.White).HasMany().WillCascadeOnDelete(false);
HasRequired(x => x.Black).HasMany().WillCascaseOnDelete(false);

生成了相同的迁移,我尝试了几种变体:

HasRequired(x => x.White)
    .HasMany(x => x.Games)
    .Map(t => t.ToTable("GamePlayer").MapKey("Game_Id", "Player_Id"));
HasRequired(x => x.Black)
    .HasMany(x => x.Games)
    .Map(t => t.ToTable("GamePlayer").MapKey("Game_Id", "Player_Id"));

在尝试生成迁移时引发错误,抱怨GamePlayer不在模型中。

我很欣赏有关我做错的任何建议。

1 个答案:

答案 0 :(得分:0)

无法配置EF以使用您的模型正确填充Player.Games集合。这就是为什么,迁移看起来与您期望的不同。没有办法告诉EF&#34;这个系列包含白色或黑色的游戏&#34;

您需要更改模型,并且有多种选择:

  1. 而不是单个Player.Games集合添加两个集合Player.GamesPlayedAsBlackPlayer.GamesPlayedAsWhite并在Player和{{1}之间配置两个一对多关系实体

  2. 手动创建Game实体

    GamePlayer