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; }
}
您创建的模型将尝试复制关系
希望这能奏效我喜欢这个解决方案。将忽略空值,并且可以保持引用完整性。