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