15.翻译系列:EF 6中的级联删除【EF 6 Code-First 系列】
程序员文章站
2022-03-13 17:53:20
原文链接:https://www.entityframeworktutorial.net/code-first/cascade-delete-in-code-first.aspx EF 6 Code-First系列文章目录: 1 翻译系列:什么是Code First(EF 6 Code First ......
原文链接:
ef 6 code-first系列文章目录:
- 1 翻译系列:什么是code first(ef 6 code first 系列)
- 2.翻译系列:为ef code-first设置开发环境(ef 6 code-first系列)
- 3.翻译系列:ef code-first 示例(ef 6 code-first系列)
- 4.翻译系列:ef 6 code-first默认约定(ef 6 code-first系列)
- 5.翻译系列:ef 6中数据库的初始化(ef 6 code-first 系列)
- 6.翻译系列:ef 6 code-first中数据库初始化策略(ef 6 code-first系列
- 7.翻译系列:ef 6中的继承策略(ef 6 code-first 系列)
- 8.翻译系列: ef 6中配置领域类(ef 6 code-first 系列)
- 9.翻译系列:ef 6以及ef core中的数据注解特性(ef 6 code-first系列)
- 9.1 翻译系列:数据注解特性之----table【ef 6 code-first 系列】
- 9.2 翻译系列:数据注解特性之---column【ef 6 code first系列】
- 9.3 翻译系列:数据注解特性之key【ef 6 code-first 系列】
- 9.4 翻译系列:ef 6以及 ef core中的notmapped特性(ef 6 code-first系列)
- 9.5 翻译系列:数据注解之foreignkey特性【ef 6 code-first系列】
- 9.6 翻译系列:数据注解之index特性【ef 6 code-first系列】
- 9.7 翻译系列:ef数据注解特性之--inverseproperty【ef 6 code-first系列】
- 9.8 翻译系列:数据注解特性之--required 【ef 6 code-first系列】
- 9.9 翻译系列:数据注解特性之--maxlength 【ef 6 code-first系列】
- 9.10 翻译系列:ef数据注解特性之stringlength【ef 6 code-first系列】
- 9.11 翻译系列:数据注解特性之--timestamp【ef 6 code-first系列】
- 9.12 翻译系列:数据注解特性之concurrencycheck【ef 6 code-first系列】
- 10.翻译系列:ef 6中的fluent api配置【ef 6 code-first系列】
- 10.1.翻译系列:ef 6中的实体映射【ef 6 code-first系列】
- 10.2.翻译系列:使用fluent api进行属性映射【ef 6 code-first】
- 11.翻译系列:在ef 6中配置一对零或者一对一的关系【ef 6 code-first系列】
- 12.翻译系列:ef 6 中配置一对多的关系【ef 6 code-first系列】
- 13.翻译系列:code-first方式配置多对多关系【ef 6 code-first系列】
- 14.翻译系列:从已经存在的数据库中生成上下文类和实体类【ef 6 code-first系列】
- 15.翻译系列:ef 6中的级联删除【ef 6 code-first 系列】
- 16.翻译系列:ef 6 code -first中使用存储过程【ef 6 code-first系列】
- 17.翻译系列:将fluent api的配置迁移到单独的类中【ef 6 code-first系列】
- 18.翻译系列:ef 6 code-first 中的seed data(种子数据或原始测试数据)【ef 6 code-first系列】
- 19.翻译系列:ef 6中定义自定义的约定【ef 6 code-first约定】
- 20.翻译系列:code-first中的数据库迁移技术【ef 6 code-first系列】
- 20.1翻译系列:ef 6中自动数据迁移技术【ef 6 code-first系列】
- 20.2.翻译系列:ef 6中基于代码的数据库迁移技术【ef 6 code-first系列】
- 21.翻译系列:entity framework 6 power tools【ef 6 code-first系列】
当数据库的父记录被删除的时候,级联删除自动的删除相关的依赖记录,或者设置外键列为null。
ef 对于一对一,一对多,多对多关系,默认是启用了级联删除。
一对一关系中的级联删除
下面的student和studentaddress实体,是一对零或一的关系。
public class student { public int studentid { get; set; } public string studentname { get; set; } public virtual studentaddress address { get; set; } } public class studentaddress { [foreignkey("student")] public int studentaddressid { get; set; } public string address1 { get; set; } public string address2 { get; set; } public string city { get; set; } public int zipcode { get; set; } public string state { get; set; } public string country { get; set; } public virtual student student { get; set; } }
下面的操作,演示了级联删除。
using (var ctx = new schoolcontext()) { var stud = new student() { studentname = "james" }; var add = new studentaddress() { address1 = "address" }; stud.address = add; ctx.students.add(stud); ctx.savechanges(); ctx.students.remove(stud);// student and its address will be removed from db ctx.savechanges(); }
在上面的代码中,首先,ef保存stud和其studentaddress实体到数据库中,然后删除stud,调用savechanges().ef就会删除stud,并且将studentaddress表中相关级联一并删除。所以,ef默认是级联删除的。
一对多关系中的级联删除
下面的student和standard实体,是一对多关系。
public class student { public int studentid { get; set; } public string studentname { get; set; } public virtual standard standard { get; set; } } public class standard { public standard() { students = new list<student>(); } public int standardid { get; set; } public string description { get; set; } public virtual icollection<student> students { get; set; } }
下面的代码,演示了一对多关系中的级联删除。
using (var ctx = new schoolcontext()) { var student1 = new student() { studentname = "james" }; var student2 = new student() { studentname = "gandhi" }; var standard1 = new standard() { standardname = "standard 1" }; student1.standard = standard1; student2.standard = standard1; ctx.students.add(student1); ctx.students.add(student2); //inserts students and standard1 into db ctx.savechanges(); //deletes standard1 from db and also set standard_standardid fk column in students table to null for // all the students that reference standard1. ctx.standards.remove(standard1); ctx.savechanges(); }
在上面的例子中,ef从数据库中删除了standard1,并且设置students表中的相关联的standard_standardid外键列为null。
请注意:对于多对多关系,如果两个实体中的任何一个删除了,ef自动的删除中间表中相关的记录。
所以,ef默认是对所有的实体【一对一的中的实体、一对多中的实体、多对多中的实体】启用了级联删除。
关闭级联删除
可以用fluent api中的willcascadeondelete()来处理级联删除,例如:
public class schoolcontext<: dbcontext { public schoolcontext():base("myschool") { } public dbset<student> students { get; set; } public dbset<standard> standards { get; set; } protected override void onmodelcreating(dbmodelbuilder modelbuilder) { modelbuilder.entity<student>() .hasoptional<standard>(s => s.standard) .withmany() .willcascadeondelete(false); } }
请注意:没有数据注解的特性,可以用来关闭级联删除。
推荐阅读
-
5.翻译系列:EF 6中数据库的初始化(EF 6 Code-First 系列)
-
9.3 翻译系列:数据注解特性之Key【EF 6 Code-First 系列】
-
2.翻译系列:为EF Code-First设置开发环境(EF 6 Code-First系列)
-
6.翻译:EF基础系列---什么是EF中的实体?
-
11.翻译系列:在EF 6中配置一对零或者一对一的关系【EF 6 Code-First系列】
-
9.7 翻译系列:EF数据注解特性之--InverseProperty【EF 6 Code-First系列】
-
9.翻译系列:EF 6以及EF Core中的数据注解特性(EF 6 Code-First系列)
-
9.9 翻译系列:数据注解特性之--MaxLength 【EF 6 Code-First系列】
-
9.10 翻译系列:EF数据注解特性之StringLength【EF 6 Code-First系列】
-
21.翻译系列:Entity Framework 6 Power Tools【EF 6 Code-First系列】