как отобразить одно-много дополнительных рекурсивных отношений в ядре Entity Framework - PullRequest
0 голосов
/ 14 мая 2018

У меня есть вызов сущности. Ответ и сущность ответа могут иметь несколько дочерних ответов, т. Е. Коллекция. Я пытаюсь отобразить это в классе конфигурации моей модели.

Класс модели

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??

    }
}

1 Ответ

0 голосов
/ 14 мая 2018

Вы начинаете со свойства навигации по коллекции:

builder
    .HasMany(answer => answer.SubQuestionAnswers)

Остальное зависит от наличия в модели свойства обратной навигации и явного свойства FK.

(A) Исходная модель (без свойства обратной навигации, без явного свойства FK)

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

(B) С добавлением в модель свойства обратной навигации

public virtual AnswerDataModel Parent { get; set; }

это будет:

.WithOne(answer => answer.Parent);

(C) При добавлении в модель свойства explcit FK

public Guid? ParentId { get; set; }

это будет:

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

(D) С добавленными в модель свойствами обратной навигации и explcit FK

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

это будет:

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

(HasForeignKey здесь можно пропустить, потому что это условно)

...