C# 实体框架:无法定义1:1关系

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

我想定义学生只能有一门最喜欢的课程的关系。我预计在DB中会是这样的:

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是的,我解决了。谢谢: