簡體   English   中英

如何創建兩個指向同一唯一字符串列的字符串外鍵?

[英]How to create 2 string foreign keys pointing at the same unique string column?

我有一個實體“ 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; }


    }

您需要在guid上指定Alternate鍵。 然后為其配置外鍵。 通過使用流暢的API來做到這一點。 此處的用法示例: https : //docs.microsoft.com/zh-CN/ef/core/modeling/alternate-keys

在您的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。

如果您不介意我問,是否有任何特定原因導致您不使用Id來引用Player和OpponentPlayer? 然后,您可以使用外鍵引用Player表。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM