【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中修改状态。

 

posted on 2016-08-09 21:56 思如雨 阅读( ...) 评论( ...) 编辑 收藏

转载于:https://www.cnblogs.com/gosky/p/5754753.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值