我有一个实体“ Player”,它具有字符串类型的“ Guid”属性,并具有唯一约束。
我有一个“ PlayerData”实体,它具有字符串类型的“ PlayerGuid”,“ OpponentPlayerGuid”属性。
如何使用EF Core确保PlayerGuid和OpponentPlayerGuid属性接受仅在Player.Guid属性内找到的值?
我已经尝试了各种方法,从关于stackoverflow的5个以上不同的答案中,没有一个能帮助我解决这个问题。
PlayerData实体
public class PlayerData
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
public int AttackLevel { get; set; } = 0;
public int DefenseLevel { get; set; } = 0;
[InverseProperty("Guid")]
public string PlayerGuid { get; set; }
public Player Player { get; set; }
//[ForeignKey("OpponentPlayerGuid")]
//public string OpponentPlayerGuid { get; set; }
public int WinStreak { get; set; } = 0;
public double Armor { get; set; }
public double Health { get; set; }
public bool Acted { get; set; }
public ActionType LastAction { get; set; }
}
玩家实体
public class Player
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
[ForeignKey("SessionId")]
public int? SessionId { get; set; }
public Session Session { get; set; }
[Required,MaxLength(36)]
public string Guid { get; set; }
public DateTime? BanTime { get; set; }
public List<PlayerData> PlayerDatas { get; set; }
}
答案 0 :(得分:1)
您需要在guid上指定Alternate键。然后为其配置外键。通过使用流畅的API来做到这一点。此处的用法示例:https://docs.microsoft.com/en-US/ef/core/modeling/alternate-keys。
答案 1 :(得分:0)
在您的DbContext类中:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<PlayerData>()
.HasOne(e => e.Player)
.WithMany() // If its a one to one relationsship, specify 'WithOne()' here
.HasForeignKey(e => e.PlayerGuid)
.OnDelete(DeleteBehavior.Restrict);
modelBuilder.Entity<PlayerData>()
.HasOne(e => e.OpponentPlayer)
.WithMany()
.HasForeignKey(e => e.OpponentPlayerGuid)
.OnDelete(DeleteBehavior.Restrict);
}
附带说明:您应该使用BCL提供的值类型Guid
而不是字符串。这样,您的ID将永远是Guid。
答案 2 :(得分:0)
如果您不介意我的问题,是否有任何特定原因导致您不使用ID来引用Player和OpponentPlayer?然后,您可以使用外键引用Player表。