EF代码优先:设置与数据注释的可选一对一关系

时间:2015-03-23 20:22:09

标签: entity-framework ef-code-first

我尝试解决以下问题:我有2个表,一个带有一些字段的课程表和一个可选的CourseDescription表(所以课程可能有一个CourseDescription但是CourseDescription < strong>必须有课程)。我正试图设置它。到目前为止,这就是我所拥有的:

public class Course
{
    [Key, Column("Key_Course")]
    public int ID { get; set; }
    public string Name { get; set; }
    public virtual CourseDescription CourseDescription { get; set; }
}

public class CourseDescription
{
    [Key, ForeignKey("Course")]
    public int ID { get; set; }
    public string Description { get; set; }
    public string PreRequis { get; set; }
    public int CoursesID { get; set; }
    [ForeignKey("CoursesID")]
    public Course Course { get; set; }
}

这“有效”意味着EF不会抱怨我的模型,但关系没有正确完成,因为EF将CourseDescription的PK与课程的PK相关联。在我的数据库中,情况并非如此(例如:CourseDescription.ID = 1与CourseDescription.CoursesID = 3相关联,而不是1)。

有没有办法通过数据注释修复它?我知道我可以使用流畅的API,但我不想仅为此覆盖模型构建(除非没有别的办法)。

由于

2 个答案:

答案 0 :(得分:1)

嗯,我认为你有两个选择:

  • 配置一对多关系

    如果您要映射CourseCourseDescription之间关系的FK,并且您不想将此FK属性声明为CourseDescription实体的关键字,那么,你没有其他选择来配置一对多的关系。在这种情况下,您的模型将是这样的:

    public class Course
    {
     [Key, Column("Key_Course")]
     public int ID { get; set; }
     public string Name { get; set; }
     public virtual ICollection<CourseDescription> CourseDescriptions { get; set;}
    }
    
    public class CourseDescription
    {
     [Key]
     public int ID { get; set; }
     public string Description { get; set; }
     public string PreRequis { get; set; }
    
     [ForeignKey("Course")]
     public int CourseID { get; set; }
     public Course Course { get; set; }
    }
    
  • 配置一对一的关系但不映射的FK 关系

    EF允许你以一对一的关系映射FK的唯一方法是将FK声明为PK时,所以如果你想在两个实体中都有不同的ID并想要建立一个一对一的关系,然后你可以做这样的事情:

    public class Course
    {
     [Key, Column("Key_Course")]
     public int ID { get; set; }
     public string Name { get; set; }
     public CourseDescription CourseDescription { get; set;}
    }
    
    public class CourseDescription
    {
     [Key]
     public int ID { get; set; }
     public string Description { get; set; }
     public string PreRequis { get; set; }
    
     [Required]
     public Course Course { get; set; }
    }
    

    使用导航属性。

答案 1 :(得分:0)

看起来你不应该将ForeignKey属性用于CourseDescription类的ID属性,因为你不想在主键之间建立关联。尝试删除它。

编辑:看起来我上一次误解了这个问题。

您可以通过这种方式获得CourseDescription。

public class CourseDescription
{
    [Key, ForeignKey("Course")]
    public int ID { get; set; }
    public string Description { get; set; }
    public string PreRequis { get; set; }
    public Course Course { get; set; }
}

在这种情况下,您不需要拥有CoursesID字段。实体将通过主键连接。