Как создать 2 строковых внешних ключа, указывающих на один и тот же уникальный строковый столбец? - PullRequest
0 голосов
/ 15 апреля 2019

У меня есть сущность "Player", у которой есть свойство "Guid" типа string с уникальным ограничением.

У меня есть сущность «PlayerData», которая имеет свойства «PlayerGuid», «OpponentPlayerGuid» типа string.

Как использовать EF Core, чтобы убедиться, что свойства PlayerGuid и OpponentPlayerGuid принимают значения, найденные только в свойстве Player.Guid?

Я пробовал разные вещи, из 5+ разных ответов на stackoverflow, но ни один из них не помог мне решить эту проблему.

Элемент 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; }


    }

Ответы [ 3 ]

1 голос
/ 15 апреля 2019

Вам нужно указать альтернативный ключ на guid.А затем настройте внешние ключи к нему.Сделайте это, используя свободный API.Примеры использования здесь: https://docs.microsoft.com/en-US/ef/core/modeling/alternate-keys.

0 голосов
/ 15 апреля 2019

Если вы не возражаете, я спрашиваю, есть ли какая-то конкретная причина, по которой вы не используете Id для ссылки на Player и OpponentPlayer? Затем вы можете использовать внешний ключ для ссылки на таблицу игроков.

0 голосов
/ 15 апреля 2019

В вашем классе 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);
}

Примечание: вы должны использовать тип значения Guid, предоставленный BCL, вместо строк.Таким образом, ваши ID всегда будут Guid.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...