我有2代表在我的数据库:实体框架组合键映射
游戏:
public class Game
{
[Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
[ForeignKey("WinningSlot"), Column(Order = 0)]
public int Id { get; set; }
public int numer { get; set; }
public string md5 { get; set; }
public string secret { get; set; }
public GameStatus Status { get; set; }
public int SlotsNumber { get; set; }
public DateTime CreationTime { get; set; }
public DateTime? EndDime { get; set; }
public DateTime? ForceEndTime { get; set; }
[ForeignKey("WinningSlot"), Column(Order = 1)]
public int WinningSlotId { get; set;
public GameSlot WinningSlot { get; set; }
public double SlotPrice { get; set; }
public List<GameSlot> Slots { get; set; }
}
GameSlot:
public class GameSlot
{
[Column(Order = 0), Key]
public int GameId { get; set; }
[ForeignKey("GameId")]
public Game Game { get; set; }
[Column(Order = 1), Key]
public int Slot { get; set; }
public int? PlayerId { get; set; }
[ForeignKey("PlayerId")]
public WotUser Player { get; set; }
public string SecretData { get; set; }
}
,你可以看到GameSlot
表的PK是复合并由GameID
(也是FK到Game
)和Slot
(它是插槽编号)组成。一切正常,直到我试图将WinningSlot
属性添加到我的Game
表中。它会在数据库更新的GameSlot
表中为它生成另一个Game_Id
列。
我所有试图搞糊涂api的尝试都失败了。你能帮助我,请建立一个正常的关系,这个工作? winningslot
列是可选的,可以为空。谢谢!
更新: 问题与FluentApi解决:
modelBuilder.Entity<Game>()
.HasOptional(g => g.WinningSlot)
.WithMany()
.HasForeignKey(g => new { g.Id, g.WinningSlotId });
但这里是另一个: 当我尝试添加插槽像这样(示例代码),它工作正常:
var game = db.Games.Find(1);
game.WinningSlotId = 1;
db.SaveChanges();
但如果我想设置插槽,请改为:
var game = db.Games.Find(1);
var gameslot = db.Slots.Find(game.Id, 1);
game.WinningSlot = gameslot;
db.SaveChanges();
它会抛出一个异常告诉我,我不能修改游戏的Id属性。这里有什么错误,如果gameslot有它的gameID = game.Id?