【发布时间】:2016-05-13 14:18:51
【问题描述】:
我有一个链接器表,将两个玩家链接在一起。一个玩家向另一个玩家发出挑战,因此我有两个相同的密钥PlayerId。但是,这似乎会产生问题。
我已经测试了以下场景:
虚拟属性:
public class WordChallenge
{
[...]
[Required]
public virtual Player IssuingPlayer { get; set; }
[Required]
public virtual Player ChallengedPlayer { get; set; }
}
在运行时产生以下异常:
无法在具有唯一索引“IX_Username”的对象“dbo.Players”中插入重复的键行。
外键属性:
public class WordChallenge
{
[...]
[Required]
[ForeignKey("PlayerId")]
public virtual Player IssuingPlayer { get; set; }
[Required]
[ForeignKey("PlayerId")]
public virtual Player ChallengedPlayer { get; set; }
}
在Add-Migration 命令期间抛出异常
类型“WhatIsThisWord.WebAPI.Models.WordChallenge”的属性“ChallengedPlayer”上的 ForeignKeyAttribute 无效。在依赖类型“WhatIsThisWord.WebAPI.Models.WordChallenge”上找不到外键名称“PlayerId”。
我想要实现的目标是让两个 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;
}
}
【问题讨论】:
标签: c# entity-framework asp.net-web-api ef-code-first