实体框架核心 - 摆脱继承对象的重复 id

时间:2021-01-29 08:02:42

标签: entity-framework-core ef-code-first ef-fluent-api table-per-type

我将 PostgreSQL 数据库与 EF Core(具有 Table-Per-Type 继承)一起使用。

我有问题和问题项目(在本例中,是回答问题的选项)。 任何问题必须IdTextCost。 问题项必须IdTextQuestionId(它所属的问题的ID)。 有些问题(例如 MultipleChoiceQuestion)包含问题项,有些则不包含(例如 TextQuestion)。

每个 QuestionItem 都有一个 QuestionId,而 MultipleChoiceQuestionAnswerOption 只能与 MultipleChoiceQuestion 一起使用。 所以我想在 MultipleChoiceQuestionAnswerOption 中有一个导航属性来引用相应的 MultipleChoiceQuestion。 我知道如果 MultipleChoiceQuestionAnswerOption 只能与 MultipleChoiceQuestion 一起使用,那么 MultipleChoiceQuestionAnswerOption.QuestionId 总是引用实际上是 QuestionMultipleChoiceQuestion。 但我不知道如何使用 EF Core 进行设置。

我想要如下实体:

public class abstract Question
{
    public Guid Id { get; set; }
    public string Text { get; set; }
    public int Cost { get; set; }
    public ICollection<QuestionItem> Items { get; set; }
}

public class TextQuestion : Question
{
    public string CorrectAnswer { get; set; }
}

public class MultipleChoiceQuestion : Question
{
    public ICollection<MultipleChoiceQuestionAnswerOption> AnswerOptions { get; set; }
}

public abstract class QuestionItem
{
    public Guid Id { get; set; }
    public string Text { get; set; }
    public Guid QuestionId { get; set; }
    public Question Question { get; set; }
}

public class MultipleChoiceQuestionAnswerOption : QuestionItem
{
    public bool IsCorrect { get; set; }
    public MultipleChoiceQuestion MultipleChoiceQuestion { get; set; }
}

具有以下关系配置:

questionBuilder
    .HasMany(question => question.Items)
    .WithOne(questionItem => questionItem.Question)
    .HasForeignKey(questionItem => questionItem.QuestionId);

multipleChoiceQuestionBuilder
    .HasMany(question => question.AnswerOptions)
    .WithOne(answerOption => answerOption.MultipleChoiceQuestion)
    .HasForeignKey(answerOption => answerOption.QuestionId);

我试过这样保留它,但是在启动应用程序时我收到此错误消息:

<块引用>

无法在数据库中表示针对“MultipleChoiceQuestion”的实体类型“MultipleChoiceQuestionAnswerOption”的外键 {'QuestionId'}。属性 {'QuestionId'} 未映射 t o 表 'multiple_choice_question_answer_options' 或主要属性 {'Id'} 未映射到表 'multiple_choice_questions'。所有外键属性都必须映射到依赖类型映射到的表和一个 所有主体属性必须映射到主体类型所映射到的单个表。

我的猜测是您需要为每个导航属性提供一个单独的外键属性。 但在这种情况下,MultipleChoiceQuestionAnswerOption 实体的​​界面将如下所示:

Guid Id { get; set; }
string Text { get; set; }
bool IsCorrect { get; set; }

Guid QuestionId { get; set; }
Guid MultipleChoiceQuestionId { get; set; }

Question Question { get; set; }
MultipleChoiceQuestion MultipleChoiceQuestion { get; set; }

并且 QuestionIdMultipleChoiceQuestionId 字段的值将始终相同(因为 MultipleChoiceQuestionAnswerOption 只能与 MultipleChoiceQuestion 一起使用)。我想摆脱这种重复,但不确定具体如何。

应该应用什么配置来为基本 QuestionId 类型和派生 Question 类型重用 MultipleChoiceQuestion 字段?

0 个答案:

没有答案