2017-04-04 67 views
0

我想定义关系,其中学生只能有一个最爱课程。我希望它看起来像这样的DB:实体框架:无法定义1:1关系

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?)

+0

首先 - 目前还不清楚为什么你需要和身份证如果你有课程。第二 - 一个学生只能有0或1个班级,一个班级可以由任意数量的学生选择 - 因此它应该是0..1到0..N这里 –

+1

这是一对多的。而且我没有在你的模型的'Course'表中得到'StudentID'(假设'Class'是'Course'),所以显然这个张贴的模型是不完整的。 –

+1

@IvanStoev是的,我发布的模型是不完整的。实体之间也有多对多的关系。我认为问题与'FavoriteCourse'关系的定义有关。但事实证明,问题是,该实体框架没有[正确识别关系](http://stackoverflow.com/questions/8228948/using-both-many-to-many-and-one-to-许多到相同的实体)。 – chriemmy

回答

1

要指定1对1关系,假定相关实体的主键与第一个实体的主键相匹配。你还应该指定一个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; } 
} 

这将是one-to-zero-or-one关系。检查这个tutorial

如果您将标记FavouriteCourse财产与RequiredAttribute,它似乎,它会导致强大的一对一的关系。

这将导致足够的数据库结构:

STUDENT 
    ID  
    Name 
    FavoriteCourseID 
COURSE 
    ID 
    Name 

但是,如果许多学生能有一个最喜欢的课程,这种结构将是一个问题,因为你想要一个一对多,而不是一对一-一。你会在数据库中有重复的记录,因为一门课程可能只涉及一名学生。你必须考虑你的数据库设计。

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

通常情况下,您可以定义下列关系之一:

  1. 可选:可选
  2. 要求:可选
  3. 可选:许多
  4. 必需:许多
  5. 许多:许多

要求:要求不是通常的关系,插入具有这种关系的第一个条目需要特殊处理。

我假设你想要求:很多例如“每个学生有一个最喜欢的课程,但许多学生可能会选择相同的最喜欢的课程”。