具有两个自引用组合键的实体框架多对多
本文关键字:实体 框架 组合 自引用 两个 | 更新日期: 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);