【问题标题】:Entity Framework asp.net MVC foreign key实体框架 asp.net MVC 外键
【发布时间】:2012-09-13 06:49:05
【问题描述】:

我正在尝试首先在代码中编写以下代码...因为我刚刚开始我无法...请帮助..提前谢谢
1. 学生:学生将拥有学生证、名字、姓氏
学生应该属于一个班级和一个部门(基本上与每个实体是一对一的关系)
2.类:类将有ClassId,Name
班级应该有学生的集合和部分的集合(基本上与每个实体有多对多的关系)
3. 部分:部分将有 SectionID、Name
部分应该属于一个班级并且应该有学生的集合(基本上与班级的一对一关系和与学生的一对多关系)
以下是相同的代码

Students.cs

public class Students  
{  
    public int StudentsId { get; set; }  
    public string FirstName { get; set; }  
    public string LastName { get; set; }  
    public string UserName { get; set; }  
    public decimal Grade { get; set; }  
    public int ClassesId { get; set; }  
    public Classes Classes { get; set; }  
    public int SectionsId { get; set; }  
    public Sections Sections { get; set; }  
}  

类.cs

public class Classes  
{  
    public int ClassesId { get; set; }  
    public string Name { get; set; }  

    public ICollection<Sections> Sections { get; set; }  
}  

Sections.cs

public class Sections
{
    public int SectionsId { get; set; }
    public string Name { get; set; }
    public int ClassesId { get; set; }

    public Classes Classes { get; set; }
    public ICollection<Students> Students { get; set; }
}

如果我这样做,我会收到错误提示:

引入 FOREIGN KEY 约束 表“Sections”上的“FK_dbo.Sections_dbo.Classes_ClassesId”可能会导致 循环或多个级联路径。指定 ON DELETE NO ACTION 或 ON UPDATE NO ACTION,或修改其他 FOREIGN KEY 约束。

我知道我可以使用流畅的 API 并告诉不要在删除时级联来消除此错误,但我不想这样做。有没有其他解决方案?请帮忙

【问题讨论】:

    标签: entity-framework ef-code-first cascade


    【解决方案1】:

    对于您当前的模型,不,除了对某些关系禁用级联删除之外别无他法。

    您的所有关系都是必需的,这意味着如果删除了一个班级,您将删除该班级的部分和学生(Classes 由于@987654323 中所需的导航属性Classes 具有未公开的学生集合@)。但是,如果这些部分被删除,该部分的学生也会被删除 - 这是Students 的第二个删除路径。

    我不知道您的模型的确切含义,但对我来说,如果班级被删除,删除班级的所有学生听起来很奇怪。学生是否总是必须上课,或者他不能暂时没有课堂作业(以及部分作业)?也许学生有半年的假期学期,没有参加任何课程?

    在这种情况下,您可以将Students 的关系设为可选。只需将外键属性声明为可为空即可:

    public class Students  
    {
        //...
        public int? ClassesId { get; set; }  
        public Classes Classes { get; set; }  
        public int? SectionsId { get; set; }  
        public Sections Sections { get; set; }  
    }
    

    这将解决您在 Students 类中存在多个级联删除路径的问题,因为默认情况下可选关系没有启用级联删除。 ClassesSections 之间的关系仍然是必需的,因此删除一个班级会同时删除属于该班级的所有部分,但不会再删除学生。

    【讨论】:

    • 实际上的想法是创建一个学校结构......在学校里有不同的班级......每个班级都有不同的部分。第一标准A部分,第一标准B,第二标准A,第二标准B,第二标准C等。这里学生实际上属于一个部分,部分属于一个班级,但最终学生也属于班级,班级将有在代码中被引用的学生次数,所以我觉得必须有关系。如果有任何其他方式来定义这种关系,请提供帮助。
    • 只是想补充一下...这里的班级人数很大,所以他们被分成几个部分...例如,如果第一标准有 80 名学生,那么他们将有 40 名学生第一标准中的两个部分 A 和 B...这里如果学生在学校注册必须属于一个班级,如果班级有部分应该属于班级内的一个部分...如果一个部分被删除,那么学生应该移动到类中的默认部分...说A部分。如果您能为此提供模型逻辑帮助我,那就太好了...感谢您的回答。 :)
    • @AmitRaya:对我来说,你的模型听起来确实不错。您只需对StudentsClasses 之间以及StudentsSections 之间的关系禁用级联删除即可。这不仅在技术上是必要的,而且从业务角度来看,级联删除对我来说也是错误的:学生不应该在一个班级被删除时被删除,他们应该被分配到另一个班级。
    猜你喜欢
    • 1970-01-01
    • 2019-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-02
    • 1970-01-01
    相关资源
    最近更新 更多