【EF学习笔记09】----------使用 EntityState 枚举标记实体状态,实现增删改查
講解之前,先來看一下我們的數據庫結構:班級表 學生表
如上圖,實體狀態由EntityState枚舉定義:Detached(未跟蹤)、Unchanged(未改變)、Added(已添加)、Deleted(已刪除)、Modified(已修改)
查看實體狀態
//查看實體狀態 using (var db = new Entities()) {var query = db.Student.First();Console.WriteLine(db.Entry(query).State);//輸出Unchanged }執行結果:
說明:輸出結果 Unchanged ,已加載到上下文中的實體為Unchanged狀態。
標記實體狀態
Console.WriteLine("==========標記狀態 EntityState.Unchanged===========");Student student; using (var db = new Entities()) {student = db.Student.Where(s => s.StudentName == "張三").First(); }//查看實體狀態 using (var db = new Entities()) {Console.WriteLine(db.Entry(student).State);//輸出Detached db.Student.Attach(student);//將實體附加到上下文中Console.WriteLine(db.Entry(student).State);//輸出Unchanged db.SaveChanges();//未執行SQL語句 }執行結果:
說明:上圖中student對象定義在上下文作用域之外,所以默認是Detached未跟蹤狀態。
調用Attach方法將對象附加到上下文中,狀態變為Unchanged。
Unchanged狀態為未改變,所以調用db.SaveChanges方法不執行SQL語句。
標記狀態 EntityState.Added
using (var db = new Entities()) {var classes = new Classes(){ClassName = "英語10501"};Console.WriteLine(db.Entry(classes).State);//輸出 Detached db.Entry(classes).State = System.Data.Entity.EntityState.Added;//修改狀態為Added//db.Classes.Add(classes); //調用DBSet.Add方法同樣的效果 Console.WriteLine(db.Entry(classes).State);//輸出 Addeddb.SaveChanges();//更新到數據庫
}
執行結果:
說明:修改狀態調用Entry方法,由Detached-->Added。DBSet.Add方法同樣效果。
標記狀態 EntityState.Modified
方式一:更新指定字段
//方式一:更新部分字段 using (var db = new Entities()) {var student = db.Student.Where(s => s.StudentName == "張三").First();Console.WriteLine(db.Entry(student).State);//輸出Detached student.StudentName = "張三豐";Console.WriteLine(db.Entry(student).State);//輸出Modified db.SaveChanges(); }追蹤SQL語句:
執行結果:
說明:根據生成的SQL語句可知,只更新了StudentName字段。未實體賦值將改變實體狀態 Unchanged-->Modified。
方式二:更新所有
using (var db = new Entities()) {var student = db.Student.Where(s => s.StudentName == "張三").First();Console.WriteLine(db.Entry(student).State);//輸出Detached db.Entry(student).State = System.Data.Entity.EntityState.Modified;student.StudentName = "張三豐";Console.WriteLine(db.Entry(student).State);//輸出Modified db.SaveChanges(); }追蹤SQL語句:
執行結果:
說明:調用Entry方法改變實體狀態 Unchanged-->Modified,會生成更新所有字段的SQL。
student.StudentName = "張三豐";db.Entry(student).State = System.Data.Entity.EntityState.Modified;這兩句順序顛倒,效果相同。
標記狀態 EntityState.Deleted
using (var db = new Entities()) {var student = db.Student.Where(n=>n.StudentName=="小芳").Single();Console.WriteLine(db.Entry(student).State);//輸出Unchanged db.Entry(student).State = System.Data.Entity.EntityState.Deleted;//db.Student.Remove(student); Console.WriteLine(db.Entry(student).State);//輸出Detached db.SaveChanges(); }追蹤SQL語句:
執行結果對比:
說明:執行了2條SQL語句:實體狀態由Unchange---->Deleted,根據主鍵刪除。
如果刪除的記錄是其他實體的外鍵,則會報錯,無法刪除。
posted on 2016-08-09 17:48 思如雨 閱讀(...) 評論(...) 編輯 收藏轉載于:https://www.cnblogs.com/gosky/p/5754128.html
總結
以上是生活随笔為你收集整理的【EF学习笔记09】----------使用 EntityState 枚举标记实体状态,实现增删改查的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: IOS 2D游戏开发框架 SpriteK
- 下一篇: PAT1016