【EF學習筆記10】----------主從表級聯操作


主從表 級聯新增

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中修改狀態。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM