【问题标题】:Entity framework: Unable to define 1:1 relationship实体框架:无法定义 1:1 关系
【发布时间】:2017-04-04 12:20:08
【问题描述】:

我想定义学生只能拥有一个最喜欢的课程的关系。我希望它在 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; }
}

这给了我这个数据库模型:

STUDENT
    ID    
    Name
    FavoriteCourseID
COURSE
    ID
    Name
    StudentID // how to remove this?

请注意,可能有几个学生有相同的最喜欢的课程,因此这是不可接受的解决方案。

另一个问题:这是什么类型的关系? (1:1 / 1:N ?)

【问题讨论】:

  • 首先 - 如果您有课程,不清楚为什么需要和 ID。第二 - 一个学生只能有 0 或 1 个班级,一个班级可以由任意数量的学生选择 - 所以这里应该是 0..1 到 0..N
  • 这是一对多。而且我没有从您的模型中获得Course 表中的StudentID(假设ClassCourse),所以显然发布的模型不完整。
  • @IvanStoev 是的,我发布的模型不完整。实体之间也存在多对多关系。我认为问题出在FavoriteCourse 关系的定义上。但事实证明,问题在于,Entity 框架没有 recognize the relation correctly
  • @chriemmy 这就是我的想法。所以根据你的评论,我假设你已经解决了这个问题:)
  • @IvanStoev 是的,我做到了。谢谢:)

标签: c# entity-framework relationship


【解决方案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

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

【讨论】:

    【解决方案2】:

    你可以试试这个:

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

    【讨论】:

      【解决方案3】:

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

      1. 可选:可选
      2. 必填:可选
      3. 可选:很多
      4. 必填:很多
      5. 很多:很多

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

      I Suppose you want 必填:许多如“每个学生都有一门最喜欢的课程,但许多学生可能选择了相同的最喜欢的课程”。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-10-03
        • 2011-11-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多