zoukankan      html  css  js  c++  java
  • 【EF学习笔记10】----------主从表级联操作

    主从表 级联新增

    Console.WriteLine("=========主从表 级联新增==========");
    using (var db = new Entities())
    {
        var classes = new Classes()
        {
            ClassName = "数学10501",
            Student = new List<Student>
            {
                new Student{StudentName="小小",Birthday=DateTime.Parse("1990-1-1")},
                new Student{StudentName="大大",Birthday=DateTime.Parse("1990-1-1")},
            }
        };
        db.Classes.Add(classes);//标记主表状态为 Added
        foreach (var st in classes.Student)
        {
            Console.WriteLine(db.Entry(st).State);//打印从表实体状态
        }
    
        db.SaveChanges();
    }

    追踪SQL语句:

    执行结果:

    说明:因为是主从表关系,所以讲主表标记为Added状态时,子表中的实体也会被标记。此处执行了3条SQL语句,分别新增班级和学生。

    主从表 级联删除

    先来看一下数据,两张表是外键关系。

    using (var db = new Entities())
    {
        var classes = db.Classes.Where(i => i.ClassName == "数学10501").FirstOrDefault();
        db.Classes.Remove(classes);//标记实体状态为 Deleted
        db.SaveChanges();
    }

    执行结果:

    说明:因为 班级表Classes 和 学生表 Student具有外键关系,所以删除班级表的数据违反了外键约定。

    情况一:删除主表数据 同时标记 从表外键为NULL

    using (var db = new Entities())
    {
        var classes = db.Classes.Where(i => i.ClassName == "数学10501").Single();
    
        db.Entry(classes).Collection(v => v.Student).Load();//显式加载
    
        db.Classes.Remove(classes);//标记状态 Deleted
    
        db.SaveChanges();
    }

    执行结果:SQL

    说明:按照EF的思路,要删除从表的外键,则同时加载主表数据和从表数据,使用Load方法。Collection方法加载导航属性是集合的类型。

    情况二:删除主表数据 同时删除从表

    //数据库非级联状态下 删除主表数据 同时 删除从表数据
    using (var db = new Entities())
    {
        var classes = db.Classes.Where(i => i.ClassName == "英语10501").Single();//查询出主表数据
    
        //此处注意 需要调用ToList方法
        //否则会报错 未经处理的异常:  System.InvalidOperationException: 集合已修改;可能无法执行枚举操作
        //foreach内部是不允许修改状态的。
        foreach (var student in classes.Student.ToList())
        {
            db.Student.Remove(student);//手动标记从表数据为 Deleted 状态
        }
    
        db.Classes.Remove(classes);//标记主表状态为 Deleted
    
        db.SaveChanges();
    }

    执行结果:

    说明:此处数据库为非级联操作,执行时必须调用ToList方法,才能在foreach中修改状态。

  • 相关阅读:
    P2711 小行星 最小割
    bzoj2141: 排队 cdq分治
    bzoj 4237: 稻草人 cdq分治
    P1527 [国家集训队]矩阵乘法 整体二分
    P2617 Dynamic Rankings 整体二分
    P3834 【模板】可持久化线段树 1(主席树) 整体二分
    SPREAD for Windows Forms 代码片段
    PHP+Oracle Instant Client
    SQL利用CASE按分组显示合计
    SPREAD for Windows Forms 控制输入法
  • 原文地址:https://www.cnblogs.com/gosky/p/5754753.html
Copyright © 2011-2022 走看看