主從表 級聯新增
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中修改狀態。
