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

时间:2017-04-04 12:20:08

标签: 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 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?)

3 个答案:

答案 0 :(得分:1)

要指定1对1关系,假设相关实体的主键与第一个实体的主键匹配。您还应该为相关实体指定 ftp_pasv($connection, true); 属性:

virtual

它将是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; } } 关系。请检查此tutorial

如果您将one-to-zero-or-one属性标记为FavouriteCourse,似乎会产生强烈的一对一关系。

这将产生足够的数据库结构:

RequiredAttribute

但是,如果很多学生可以有一个喜欢的课程,这个结构将是一个问题,因为你想要一对多而不是一对一。并且您将在数据库中有重复的记录,因为一个课程只能引用一个学生。你必须考虑你的数据库设计。

答案 1 :(得分:0)

你可以试试这个:

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

答案 2 :(得分:0)

通常,您定义以下关系之一:

  1. 可选:可选
  2. 必需:可选
  3. 可选:许多
  4. 必需:许多
  5. 许多:许多
  6. 具有要求:必需不是通常的关系,插入具有这种关系的第一个条目需要特殊处理。

    我想你想要的是:很多像在"每个学生都有一个喜欢的课程,但很多学生可能选择了同​​样喜欢的课程"。