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

时间:2016-01-23 23:09:01

标签: c# sql .net database entity-framework

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

实体 - PK(QuestID,舞台)

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");
            });
    }
}

1 个答案:

答案 0 :(得分:0)

经过一些修修补补后,我终于开始工作了。我确实决定改名,但它的想法是一样的。

<强>实体

    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);