C# 实体框架:无法定义1:1关系
我想定义学生只能有一门最喜欢的课程的关系。我预计在DB中会是这样的:C# 实体框架:无法定义1:1关系,c#,entity-framework,relationship,C#,Entity Framework,Relationship,我想定义学生只能有一门最喜欢的课程的关系。我预计在DB中会是这样的: STUDENT ID Name FavoriteCourseID COURSE ID Name 如何通过实体框架实现这一点?我更喜欢通过属性来指定它。我试过: public class Student { public int ID { get; set; } public string Name { get; set; } public Course
STUDENT
ID
Name
FavoriteCourseID
COURSE
ID
Name
如何通过实体框架实现这一点?我更喜欢通过属性来指定它。我试过:
public class Student
{
public int ID { get; set; }
public string Name { get; set; }
public Course FavoriteCourse { get; set; }
public int? FavoriteCourseID { get; set; }
}
public class Class
{
public int ID { get; set; }
public string Name { get; set; }
}
这给了我这个DB模型:
STUDENT
ID
Name
FavoriteCourseID
COURSE
ID
Name
StudentID // how to remove this?
请注意,可能会有几个学生有相同的最喜欢的课程,因此这是不可接受的解决方案
另一个问题:这是什么类型的关系?1:1/1:N?要指定1对1关系,假定相关实体的主键与第一个实体的主键匹配。此外,还应为相关实体指定虚拟财产:
public class Student
{
[Key]
public int ID { get; set; }
public string Name { get; set; }
public Course FavoriteCourse { get; set; }
public int? FavoriteCourseID { get; set; }
}
public class Class
{
[Key]
[ForeignKey("Student")]
public int ID { get; set; }
public string Name { get; set; }
public virtual Student Student { get; set; }
}
这将是一对零或一种关系。看看这个
如果您将FavoriteCourse属性标记为RequiredAttribute,似乎会产生一对一的强关系
这将产生足够的数据库结构:
STUDENT
ID
Name
FavoriteCourseID
COURSE
ID
Name
然而,如果许多学生都有一门最喜欢的课程,这种结构将是一个问题,因为你想要一对多而不是一对一。数据库中会有重复的记录,因为一门课程只能引用一个学生。您必须考虑您的数据库设计。您可以尝试以下方法:
public class Student
{
public int ID { get; set; }
public string Name { get; set; }
[ForeignKey("FavoriteCourseId")]
public Course FavoriteCourse { get; set; }
public int? FavoriteCourseId { get; set; }
}
通常,定义以下关系之一: 可选:可选 必需:可选 可选:许多 所需:许多 很多:很多 have Required:Required不是常见的关系,插入具有这种关系的第一个条目需要特殊处理
我想你想要必修课:每个学生都有一门最喜欢的课程,但许多学生可能会选择相同的最喜欢的课程。首先,不清楚你为什么需要,也不清楚你是否有课程。第二,一个学生只能有0或1个班级,任何数量的学生都可以选择一个班级,所以应该是0..1到0..N这里是一对多。假设课程是课程,我不会从你的模型中得到课程表中的StudentID,所以显然发布的模型是不完整的。@IvanStoev是的,我发布的模型是不完整的。实体之间也存在多对多关系。我认为问题在于偏好课程关系的定义。但事实证明,问题是,实体框架没有。@chriemmy我就是这么想的。因此,根据你的评论,我认为你已经解决了这个问题:@IvanStoev是的,我解决了。谢谢: