原文鏈接:https://www.entityframeworktutorial.net/code-first/cascade-delete-in-code-first.aspx EF 6 Code-First系列文章目錄: 1 翻譯系列:什麼是Code First(EF 6 Code First ...
原文鏈接:https://www.entityframeworktutorial.net/code-first/cascade-delete-in-code-first.aspx
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);
}
}
請註意:沒有數據註解的特性,可以用來關閉級聯刪除。