2016-05-13 11 views
0

Ich habe eine Linkertabelle, die zwei Spieler verbindet. Ein Spieler stellt eine Herausforderung an einen anderen Spieler, also habe ich zwei gleiche Schlüssel PlayerId. Dies scheint jedoch Probleme zu schaffen.Entity Framework-Modell mit mehreren gleichen fremden Schlüssel

Ich habe folgende Szenarien erprobt:

Virtuelle Eigenschaften:

public class WordChallenge 
{ 
    [...]   

    [Required] 
    public virtual Player IssuingPlayer { get; set; } 

    [Required] 
    public virtual Player ChallengedPlayer { get; set; } 
} 

Ist die folgende Ausnahme während der Laufzeit der Herstellung:

Kann keine doppelte Schlüsselzeile in Objekt einfügen " dbo.Players 'mit dem eindeutigen Index' IX_Username '.

ForeignKey Attribut:

public class WordChallenge 
{ 
    [...] 

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

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

} 

Wirft eine Ausnahme während des Add-Migration Befehl

Die ForeignKeyAttribute auf Eigenschaft 'ChallengedPlayer' on type 'WhatIsThisWord.WebAPI.Models.WordChallenge' ist ungültig. Der Fremdschlüssel-Name 'PlayerId' wurde nicht im abhängigen Typ 'WhatIsThisWord.WebAPI.Models.WordChallenge' gefunden.


Das Ziel, das ich zu erreichen versuche, ist in der Lage sein, beide playerIds in der Tabelle zu haben.


Spieler Modell:

Datacontract steuert JSON Serialisierung

[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; 
     } 
    } 

Antwort

1

Können Sie versuchen, ein Modell zu bauen wie dieser

Das Modell, das Sie erstellt haben, würde versuchen, die Beziehung zu duplizieren.

Hoffe, das wird funktionieren

Verwandte Themen