2016-05-13 1 views
0

У меня есть стол компоновщика, который соединяет двух игроков. Игрок бросает вызов другому игроку, поэтому у меня есть два одинаковых ключа 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; 
     } 
    } 

ответ

1

Вы можете попробовать построить модель как этот

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

Модель, которую вы создали, попытается дублировать отношения.

Надеюсь, что это сработает