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