【问题标题】:Entity Framework Many To Many With Two Self Referencing Composite Keys具有两个自引用复合键的多对多实体框架
【发布时间】:2016-01-23 23:09:01
【问题描述】:

我有一个使用复合键作为 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");
            });
    }
}

【问题讨论】:

  • 通过您的示例,我假设您使用的是“代码优先”方法。这样做时您是否尝试过“数据库优先”?
  • 是的,我首先使用代码。我没有先尝试过数据库,但我可以尝试一下,看看它为我生成了什么。
  • 这将是我的第一次尝试——主要是因为 SQL 是我比 EF 更好的朋友。 ;)

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


【解决方案1】:

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

实体

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-05
    • 2011-11-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多