1

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;
        }
    }
Serguei Fedorov
  • 7,763
  • 9
  • 63
  • 94

1 Answers1

3

Can you try building a model like this

public class WordChallenge
{
    [Required]
    public Guid IssuingPlayerID { get; set; }

    [Required]
    public Guid ChallengedPlayerID { get; set; }

    [ForeignKey("IssuingPlayerId")]
    public virtual Player IssuingPlayer { get; set; }

    [ForeignKey("ChallengedPlayerID")]
    public virtual Player ChallengedPlayer { get; set; }
}

The model which you have created would try to duplicate the relationship.

Hope this will work

Jayaraj.K
  • 928
  • 9
  • 30