我尝试解决以下问题:我有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,但我不想仅为此覆盖模型构建(除非没有别的办法)。
由于
答案 0 :(得分:1)
嗯,我认为你有两个选择:
配置一对多关系
如果您要映射Course
和CourseDescription
之间关系的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字段。实体将通过主键连接。