I have a linker table which links together two players. A player issues a challenge to another player, thus I have two of the same keys PlayerId. However, this seems to be creating issues.
I have tested out the following scenarios:
Virtual Properties:
public class WordChallenge
{
    [...]        
    [Required]
    public virtual Player IssuingPlayer { get; set; }
    [Required]
    public virtual Player ChallengedPlayer { get; set; }
}
Is producing the following exception during runtime:
Cannot insert duplicate key row in object 'dbo.Players' with unique index 'IX_Username'.
ForeignKey Attribute:
public class WordChallenge
{
    [...]
    [Required]
    [ForeignKey("PlayerId")]
    public virtual Player IssuingPlayer { get; set; }
    [Required]
    [ForeignKey("PlayerId")]
    public virtual Player ChallengedPlayer { get; set; }
}
Throws an exception during the Add-Migration command
The ForeignKeyAttribute on property 'ChallengedPlayer' on type 'WhatIsThisWord.WebAPI.Models.WordChallenge' is not valid. The foreign key name 'PlayerId' was not found on the dependent type 'WhatIsThisWord.WebAPI.Models.WordChallenge'.
The goal I am trying to achieve is to be able to have both playerIds be in the table.
Player Model:
DataContract controls JSON serialization
[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;  }
}
Insert Code:
    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;
        }
    }