Entity framework ef代码首先将子类映射到单个外键
我在任何地方都找不到这个问题的答案,所以就这样吧 我有几个子类的“答案”类型。所有答案都需要回到他们的问题 默认情况下,当ef创建“Answers”表时,它会创建一个外键引用,该外键引用名为FullNameQuestion\u QuestionId,另一个外键引用名为TextboxQuestion\u QuestionId 我希望TextboxQuestion和FullNameQuestion都使用相同的QuestionId外键。我不知道如何让映射为此工作Entity framework ef代码首先将子类映射到单个外键,entity-framework,inheritance,mapping,entity-framework-4.1,ef-code-first,Entity Framework,Inheritance,Mapping,Entity Framework 4.1,Ef Code First,我在任何地方都找不到这个问题的答案,所以就这样吧 我有几个子类的“答案”类型。所有答案都需要回到他们的问题 默认情况下,当ef创建“Answers”表时,它会创建一个外键引用,该外键引用名为FullNameQuestion\u QuestionId,另一个外键引用名为TextboxQuestion\u QuestionId 我希望TextboxQuestion和FullNameQuestion都使用相同的QuestionId外键。我不知道如何让映射为此工作 public abstract
public abstract class Question
{
public int QuestionId { get; set; }
private string Text { get; set; }
}
public class TextboxQuestion : Question
{
public string TextboxValue { get; set; }
public virtual List<TextboxAnswer> TextboxAnswers { get; set; }
}
public class FullNameQuestion : Question
{
public string FirstName { get; set; }
public string MiddleName { get; set; }
public string LastName { get; set; }
public virtual List<FullNameAnswer> FullNameAnswers { get; set; }
}
public abstract class Answer
{
public int AnswerId { get; set; }
public int UserId { get; set; }
}
public class TextboxAnswer : Answer
{
public string TextboxValue { get; set; }
}
public class FullNameAnswer:Answer
{
public string FirstName { get; set; }
public string MiddleName { get; set; }
public string LastName { get; set; }
}
我现在玩了一点,它只是证实了我的期望。这可能是不可能的。在派生实体中映射的列在层次结构中的所有实体中必须是唯一的。如果我试图将关系重新映射到同一列,我会得到一个异常,即已经使用了具有相同名称的列。只有共享列才能在父实体中定义,因此,除非您将导航属性移动到base
Question
和reference baseAnswer
,否则无法实现这一点
public class TextboxAnswer : Answer
{
[ForeignKey("Question")]
public int QuestionId { get; set; }
public virtual Question Question { get; set; }
public string TextboxValue { get; set; }
}
public class FullNameAnswer:Answer
{
[ForeignKey("Question")]
public int QuestionId { get; set; }
public virtual Question Question { get; set; }
public string FirstName { get; set; }
public string MiddleName { get; set; }
public string LastName { get; set; }
}