У меня есть стол компоновщика, который соединяет двух игроков. Игрок бросает вызов другому игроку, поэтому у меня есть два одинаковых ключа PlayerId
. Однако, похоже, это создает проблемы.Модель структуры Entity с несколькими одинаковыми внешними ключами
Я опробованы следующие сценарии:
Виртуальные свойства:
public class WordChallenge
{
[...]
[Required]
public virtual Player IssuingPlayer { get; set; }
[Required]
public virtual Player ChallengedPlayer { get; set; }
}
производит следующее исключение во время выполнения:
Невозможно вставить дубликат ключа строки в объект ' dbo.Players 'с уникальным индексом' IX_Username '.
ForeignKey Атрибут:
public class WordChallenge
{
[...]
[Required]
[ForeignKey("PlayerId")]
public virtual Player IssuingPlayer { get; set; }
[Required]
[ForeignKey("PlayerId")]
public virtual Player ChallengedPlayer { get; set; }
}
Выдает исключение во время команды Add-Migration
ForeignKeyAttribute на собственность 'ChallengedPlayer' от типа 'WhatIsThisWord.WebAPI.Models.WordChallenge' является недействительно. Имя внешнего ключа «PlayerId» не было найдено в зависимом типе «WhatIsThisWord.WebAPI.Models.WordChallenge».
Цель Я пытаюсь добиться, чтобы быть в состоянии иметь оба playerIds быть в таблице.
Модель игрока:
DataContract управления JSON сериализацию
[DataContract]
public class Player
{
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
[Key, Column(Order=0)]
[DataMember]
public Guid PlayerId { get; set; }
public virtual ICollection<Player> Friends { get; set; }
[Required]
public virtual string Password { get; set; }
[MaxLength(100)]
[Index(IsUnique = true)]
[DataMember]
public string Username { get; set; }
[Required]
public string Email { get; set; }
public virtual ICollection<WordChallenge> IssuedChallenges { get; set; }
public virtual ICollection<WordChallenge> ReceivedChallenges { get; set; }
}
Вставьте код:
public async Task<Models.WordChallenge> CreateChallenge(Player challenger, Player challengeReceiver, WordChallenge challenge)
{
using (var model = _modelFactory.New())
{
challenge.IssuingPlayer = challenger;
challenge.ChallengedPlayer = challengeReceiver;
model.WordChallenges.Add(challenge);
await model.SaveChangesAsync();
return challenge;
}
}