作为一项学习练习,我正在尝试创建一个国际象棋网站。我正在使用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个表:
但它创建了2个表:
我可以理解,如果一个游戏只有一个玩家,那么将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不在模型中。
我很欣赏有关我做错的任何建议。
答案 0 :(得分:0)
无法配置EF以使用您的模型正确填充Player.Games
集合。这就是为什么,迁移看起来与您期望的不同。没有办法告诉EF&#34;这个系列包含白色或黑色的游戏&#34;
您需要更改模型,并且有多种选择:
而不是单个Player.Games
集合添加两个集合Player.GamesPlayedAsBlack
,Player.GamesPlayedAsWhite
并在Player
和{{1}之间配置两个一对多关系实体
手动创建Game
实体
GamePlayer