具有多个相同外键的实体框架模型

时间:2016-05-13 04:21:11

标签: c# entity-framework asp.net-web-api ef-code-first

我有一个链接表,将两个玩家链接在一起。玩家向另一个玩家发出挑战,因此我有两个相同的密钥PlayerId。然而,这似乎正在产生问题。

我测试了以下场景:

虚拟属性:

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' on type' WhatIsThisWord.WebAPI.Models.WordChallenge'无效。外键名称' PlayerId'没有找到依赖类型' WhatIsThisWord.WebAPI.Models.WordChallenge'。

我想要实现的目标是能够将两个playerId放在桌面上。

玩家模型:

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 个答案:

答案 0 :(得分:2)

你能尝试建立这样的模型

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

您创建的模型会尝试复制关系。

希望这会起作用