主从表 级联新增

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

【EF学习笔记10】----------主从表级联操作的更多相关文章

  1. MySQL第五个学习笔记 该数据表的操作

    MySQL在创建表,创建.frm文件保存表和列定义.索引存储在一个.MYI(MYindex)且数据存储在有.MYD(MYData)扩展名的文件里.   一.用SHOW/ DESCRIBE语句显示数据表 ...

  2. MySql cmd下的学习笔记 —— 有关建立表的操作(有关于数据类型)

    (01)建表的过程实际上是 声明字段 的过程 一. 列类型(字段): 存储同样的数据时,不同的列类型,所占据的空间和效率是不一样的,这就是建表时要考虑的意义. 二.MySQL三大列类型     数值型 ...

  3. JavaScript学习笔记(10)——JavaScript语法之操作DOM

    1.页面输出用document.write()方法,但是不可以在window.onload中用,否则整个html页面将被覆盖. 2.通过javascript获取对象后,改变对象中的html内容:doc ...

  4. Android:日常学习笔记(10)———使用LitePal操作数据库

    Android:日常学习笔记(10)———使用LitePal操作数据库 引入LitePal 什么是LitePal LitePal是一款开源的Android数据库框架,采用了对象关系映射(ORM)的模式 ...

  5. X-Cart 学习笔记(四)常见操作

    目录 X-Cart 学习笔记(一)了解和安装X-Cart X-Cart 学习笔记(二)X-Cart框架1 X-Cart 学习笔记(三)X-Cart框架2 X-Cart 学习笔记(四)常见操作 五.常见 ...

  6. EF学习笔记(十二):EF高级应用场景

    学习总目录:ASP.NET MVC5 及 EF6 学习笔记 - (目录整理) 上篇链接:EF学习笔记(十一):实施继承 本篇原文链接:Advanced Entity Framework Scenari ...

  7. EF学习笔记(十一):实施继承

    学习总目录:ASP.NET MVC5 及 EF6 学习笔记 - (目录整理) 上篇链接:EF学习笔记(十) 处理并发 本篇原文链接:Implementing Inheritance 面向对象的世界里, ...

  8. EF学习笔记(十) 处理并发

    总目录:ASP.NET MVC5 及 EF6 学习笔记 - (目录整理) 上一篇:EF学习笔记(九):异步处理和存储过程 本篇原文链接:Handling Concurrency Concurrency ...

  9. EF学习笔记(八):更新关联数据

    学习笔记主目录链接:ASP.NET MVC5 及 EF6 学习笔记 - (目录整理) 上一篇链接:EF学习笔记(七):读取关联数据 本篇原文链接:Updating Related Data 本篇主要考 ...

随机推荐

  1. html第一阶段总结

    html格式汇总 <!doctype html><!-- html5格式声明 --> <html lang="en"><!-- 语言,en ...

  2. SqlServer性能优化:创建性能监视器(二)

    添加三个选项: 下一步就可以了 Sql跟踪的模板: 跟踪Sql 语句的执行情况: 使用刚才的新建的模板: 用到的Sql语句: select * from [Sales].[SalesOrderDeta ...

  3. 上载android应用的apk文件变成了zip-网下转载的解决方案

    下载android应用的apk文件变成了zip--网上转载的解决方案 下载android应用的apk文件变成了zip--网上转载的解决方案 解决方案一. 最近把开发的android应用放在公司网站上, ...

  4. JavaScript作用域学习笔记

    重点知识点摘要 一 函数对象和其它对象一样,拥有可以通过代码访问的属性和一系列仅供JavaScript引擎访问的内部属性 其中一个内部属性是[[Scope]],由ECMA-262标准第三版定义,该内部 ...

  5. 讨论贴:在sp_executesql 中生成的临时表的可见性

    首先创建数据表 IF object_id('TestTable') IS NOT NULL DROP TABLE TestTable GO ,),Info )) GO INSERT TestTable ...

  6. jQuery UI Autocomplete是jQuery UI的自动完成组件(share)

    官网:http://jqueryui.com/autocomplete/ 以下分享自:http://www.cnblogs.com/yuzhongwusan/archive/2012/06/04/25 ...

  7. register_chrdev_region/alloc_chrdev_region和cdev注册字符设备驱动

    内核提供了三个函数来注册一组字符设备编号,这三个函数分别是 register_chrdev_region().alloc_chrdev_region() 和 register_chrdev(). (1 ...

  8. IOC及Bean容器

    1. 接口及面向接口编程 1.1. 接口 用于沟通的中介物的抽象化 实体把自己提供给外界的一种抽象化说明,用以由内部操作分离出外部沟通方法,使其能被修改内部而不影响外界其他实体与其交互的方式 对应JA ...

  9. java io系列14之 DataInputStream(数据输入流)的认知、源码和示例

    本章介绍DataInputStream.我们先对DataInputStream有个大致认识,然后再深入学习它的源码,最后通过示例加深对它的了解. 转载请注明出处:http://www.cnblogs. ...

  10. maven的SNAPSHOT版本和正式版本不同

    转载文章: http://www.huangbowen.net/blog/2016/01/29/understand-official-version-and-snapshot-version-in- ...