如何在Entity Framework Core中映射一对多可选递归关系

4

我有一个名为Answers的实体,答案实体可以有多个子答案,即集合。我在模型配置类中很难映射这个。

模型类

public class AnswerDataModel : IDataModel<Guid>
{
    public AnswerDataModel()
    {

        SubQuestionAnswers = new HashSet<AnswerDataModel>();
    }
    public Guid Id { get; set; }

    public Guid QuestionId { get; set; }

    public string Value { get; set; }

    public virtual ICollection<AnswerDataModel> SubQuestionAnswers { get; set; }
}

回答配置类

public class AnswerEntityConfiguration : IEntityTypeConfiguration<AnswerDataModel>
{
    public void Configure(EntityTypeBuilder<AnswerDataModel> builder)
    {
        builder.ToTable("Answers");
        builder.HasKey(answer => answer.Id);

        builder
            .HasOne(answer => answer.Question)
            .WithMany(question => question.Answers)
            .HasForeignKey(answer => answer.QuestionId);

       builder
             .????????  // how to map recursive Answer Collections as subQuestionAnswer??

    }
}

我已经这样做了: builder.HasMany(answer => answer.SubQuestionAnswers) .WithOne() .HasForeignKey(answer => answer.Id); 但是我在SQL Server Management Studio图表中看不到任何递归关系。 - K.Z
1个回答

13

你开始使用集合导航属性:

builder
    .HasMany(answer => answer.SubQuestionAnswers)

其余部分取决于模型中是否存在反向导航属性和显式外键属性。

(A) 原始模型(无反向导航属性,无显式外键属性)

.WithOne()
.HasForeignKey("ParentId")
.IsRequired(false);

(B)将反向导航属性添加到模型中

public virtual AnswerDataModel Parent { get; set; }

这将是:

.WithOne(answer => answer.Parent);

(C)将显式 FK 属性添加到模型中

public Guid? ParentId { get; set; }

它应该是:

.WithOne()
.HasForeignKey(answer => answer.ParentId);

(D) 在模型中添加了反向导航和显式外键属性

public virtual AnswerDataModel Parent { get; set; }
public Guid? ParentId { get; set; }

这将是:

.WithOne(answer => answer.Parent)
.HasForeignKey(answer => answer.ParentId);

(这里的 HasForeignKey 可以省略,因为这是惯例)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接