问题描述
我将 PostgreSQL 数据库与 EF Core(具有 Table-Per-Type
继承)一起使用。
我有问题和问题项目(在本例中,是回答问题的选项)。
任何问题必须有Id
、Text
和Cost
。
问题项必须有Id
、Text
和QuestionId
(它所属的问题的ID)。
有些问题(例如 MultipleChoiceQuestion
)包含问题项,有些则不包含(例如 TextQuestion
)。
每个 QuestionItem
都有一个 QuestionId
,而 MultipleChoiceQuestionAnswerOption
只能与 MultipleChoiceQuestion
一起使用。
所以我想在 MultipleChoiceQuestionAnswerOption
中有一个导航属性来引用相应的 MultipleChoiceQuestion
。
我知道如果 MultipleChoiceQuestionAnswerOption
只能与 MultipleChoiceQuestion
一起使用,那么 MultipleChoiceQuestionAnswerOption
.QuestionId
总是引用实际上是 Question
的 MultipleChoiceQuestion
。
但我不知道如何使用 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; }
并且 QuestionId
和 MultipleChoiceQuestionId
字段的值将始终相同(因为 MultipleChoiceQuestionAnswerOption
只能与 MultipleChoiceQuestion
一起使用)。我想摆脱这种重复,但不确定具体如何。
应该应用什么配置来为基本 QuestionId
类型和派生 Question
类型重用 MultipleChoiceQuestion
字段?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)