【问题标题】:Entity Framework Model With Multiple Same Foreign Keys具有多个相同外键的实体框架模型
【发布时间】: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


    【解决方案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; }
    }
    

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

    希望这会奏效

    【讨论】:

    • 我喜欢这个解决方案。忽略 Null 并保持参照完整性。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-05
    • 2019-02-23
    • 1970-01-01
    • 2020-12-23
    • 2013-08-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多