具有两个自引用组合键的实体框架多对多

本文关键字:实体 框架 组合 自引用 两个 | 更新日期: 2023-09-27 18:31:33

我有一个使用复合键作为PK的实体。 我想向自身添加一个QuestStage集合,但在映射键时,实体框架告诉我该键已被使用。 处理这种情况的最佳方法是什么? 我需要两个密钥来共享QuestID因为两个QuestStages都属于一个Quest

实体 - PK(任务ID,阶段)

public class QuestStage
{
    public QuestStage
    {
        FollowUpQuestStages = new List<QuestStage>();
    }
    public int QuestID { get; set; }
    public int Stage { get; set; }
    public virtual ICollection<QuestStage> FollowUpQuestStages { get; set; }
}

映射

public class QuestStageMap : EntityTypeConfiguration<QuestStage>
{
    public QuestStageMap()
    {
        // Non Problematic Mappings
        // Problematic Mapping
        HasMany(x => x.FollowUpQuestStages)
            .WithMany()
            .Map(m =>
            {
                m.ToTable("FollowUpQuestStage");
                m.MapLeftKey("QuestID", "StageID");
                m.MapRightKey("QuestID", "FollowUpStageID");
            });
    }
}

具有两个自引用组合键的实体框架多对多

经过一番修补,我终于让它工作了。 我确实决定稍微改个名字,但这是同样的想法。

实体

    public partial class QuestStageChain
    {
        public int QuestID { get; set; }
        public int StageID { get; set; }
        public int NextStageID { get; set; }
        public virtual QuestStage QuestStage { get; set; }
        public virtual QuestStage NextQuestStage { get; set; }
    }

映射

        this.HasRequired(t => t.QuestStage)
            .WithMany(t => t.QuestStageChains)
            .HasForeignKey(d => new { d.QuestID, d.NextStageID })
            .WillCascadeOnDelete(false);
        this.HasRequired(t => t.NextQuestStage)
            .WithMany(t => t.NextQuestStages)
            .HasForeignKey(d => new { d.QuestID, d.StageID })
            .WillCascadeOnDelete(false);