ef代码首先将子类映射到单个外键

时间:2011-08-12 19:05:26

标签: entity-framework inheritance mapping entity-framework-4.1 ef-code-first

我无法在任何地方找到答案,所以就这样了。

我有几个子类“答案”类型。所有答案都需要参考他们的问题。

默认情况下,当ef创建“Answers”表时,它会创建一个名为FullNameQuestion_QuestionId的问题表的外键引用,以及一个名为TextboxQuestion_QuestionId的外键引用。

我想要的是TextboxQuestion和FullNameQuestion都使用相同的QuestionId外键。我无法弄清楚如何使映射适用于此。

   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; }
    }

我尝试将问题ID添加到TextboxAnswer和FullNameAnswer这样的类中,但它只创建了两列,QuestionId和QuestionId1。有没有办法让这些共享同一列?

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; }
    }

1 个答案:

答案 0 :(得分:1)

我现在玩了一点点,它只是证实了我的期望。这可能是不可能的。在派生实体中映射的列在层次结构中的所有实体中必须是唯一的。如果我试图将关系重新映射到同一列,我得到例外,说已经使用了具有相同名称的列。唯一的共享列可以在父实体中定义,因此在您将导航属性移动到基础Question和引用基础Answer之前,您将无法实现此目标。