主从表 级联新增

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. 闭包的理解-from my own opinion

    闭包,说起来那么难,其实理解了作用域,那么理解闭包就容易多了. 全局环境,局部环境,这两个概念很好理解了.那么要深入理解下函数的局部环境. 函数的局部环境,也就是说在一个函数内定义的变量,这个变量只能 ...

  2. 2016 - 1 - 23 json转模型 常用的第三方框架

    一: 三个常用的框架 1. Mantle - 所有模型必须继承MTModel 2. JSONModel - 所有模型必须继承JSONModel 3.MJExtension - 不需要继承任何东西. - ...

  3. 【LeetCode】Binary Tree Preorder Traversal

    Binary Tree Preorder Traversal Given a binary tree, return the preorder traversal of its nodes' valu ...

  4. Classes

    Class Organization Following the standard Java convention, a class should begin with a list of varia ...

  5. C#中using关键字的作用及用法

    using的用途和使用技巧. 1.  引用命名空间 2.  为命名空间或类型创建别名 3.  使用using语句 1.  引用命名空间,这样可以在程序中引用命名空间的类型而不必指定详细的命名空间. a ...

  6. Animations功能(区别于Transitions)

    CSS3实现动画: 1  Transitions:定义元素的某个属性从一个属性值平滑过渡到另一个属性值. Transitions属性的使用方法如下所示: transition: property | ...

  7. 解决R速度太慢问题

    R的速度慢一直被人诟病,最近做一个比较大的dataset的分析,跑得实在太慢,发现症结是R的data frame的index太慢: 以下为测试: gene_list = 1:100000 eQTL_m ...

  8. Python条件语句

    1.简介 多个条件判断,用elif语句. 如果判断需要多个条件需同时判断时,可以使用 or (或),表示两个条件有一个成立时判断条件成功: 使用 and (与)时,表示只有两个条件同时成立的情况下,判 ...

  9. C++ Primer : : 第十四章 : 重载运算符与类型转换之类型转换运算符和重载匹配

    类型转换运算符 class SmallInt { public: SmallInt(int i = 0) : val(i) { if (i < 0 || i > 255) throw st ...

  10. vector的应用

    1.0基本操作 (1)头文件: #include<vector>; (2)创建: vector<int>vec, vector<double>vec, vector ...