Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/codeigniter/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 具有多个相同外键的实体框架模型_C#_Entity Framework_Asp.net Web Api_Ef Code First - Fatal编程技术网

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

C# 具有多个相同外键的实体框架模型,c#,entity-framework,asp.net-web-api,ef-code-first,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 Challen

我有一个链接表,它将两个玩家链接在一起。一个玩家向另一个玩家发出挑战,因此我有两个相同的键
PlayerId
。然而,这似乎在制造问题

我已经测试了以下场景:

虚拟财产:

public class WordChallenge
{
    [...]        

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

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

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

    [Required]
    [ForeignKey("PlayerId")]
    public virtual Player ChallengedPlayer { 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;
        }
    }
正在运行时生成以下异常:

无法在具有唯一索引“IX_Username”的对象“dbo.Players”中插入重复的键行

外键属性:

public class WordChallenge
{
    [...]        

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

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

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

    [Required]
    [ForeignKey("PlayerId")]
    public virtual Player ChallengedPlayer { 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;
        }
    }
添加迁移
命令期间引发异常

类型“WhatIsThisWord.WebAPI.Models.WordChallenge”的属性“ChallengedPlayer”上的ForeignKeyAttribute无效。在依赖类型“WhatIsThisWord.WebAPI.Models.WordChallenge”上未找到外键名“PlayerId”


我想要达到的目标是让两名球员都能上场


播放器型号:

public class WordChallenge
{
    [...]        

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

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

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

    [Required]
    [ForeignKey("PlayerId")]
    public virtual Player ChallengedPlayer { 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;
        }
    }
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;  }
}
[DataContract]
公开课选手
{
[数据库生成(DatabaseGeneratedOption.Identity)]
[键,列(顺序=0)]
[数据成员]
公共Guid播放器ID{get;set;}
公共虚拟ICollection好友{get;set;}
[必需]
公共虚拟字符串密码{get;set;}
[MaxLength(100)]
[索引(IsUnique=true)]
[数据成员]
公共字符串用户名{get;set;}
[必需]
公共字符串电子邮件{get;set;}
公共虚拟ICollection IssuedChallenges{get;set;}
公共虚拟ICollection接受挑战{get;set;}
}
插入代码:

public class WordChallenge
{
    [...]        

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

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

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

    [Required]
    [ForeignKey("PlayerId")]
    public virtual Player ChallengedPlayer { 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;
        }
    }
public async Task createchallenger(Player challenger、Player challenger receiver、wordchallenger)
{
使用(var model=\u modelFactory.New())
{
challenge.IssuingPlayer=挑战者;
challenge.ChallengedPlayer=挑战者接收者;
model.WordChallenges.Add(challenge);
wait model.saveChangesSync();
回归挑战;
}
}

你能试着建立一个这样的模型吗

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; }
}
您创建的模型将尝试复制关系


希望这能奏效

我喜欢这个解决方案。将忽略空值,并且可以保持引用完整性。