Entity?Framework根據(jù)實(shí)體的EntityState狀態(tài)實(shí)現(xiàn)增刪改查
在上一篇文章中,我們講解了使用EF實(shí)現(xiàn)簡(jiǎn)單的增刪改查,在這篇文章中我們使用實(shí)體的EntityState狀態(tài)來(lái)優(yōu)化數(shù)據(jù)的增刪改查。
一、修改數(shù)據(jù)
上篇文章中的修改數(shù)據(jù)的方法是EF官方推薦的方式,即先查詢出來(lái)要修改的數(shù)據(jù),然后在修改。但是這種操作會(huì)導(dǎo)致多次操作數(shù)據(jù)庫(kù):

從上面的截圖中可以看出,查詢數(shù)據(jù)的時(shí)候會(huì)執(zhí)行一次事物,修改的時(shí)候又執(zhí)行了一次事物,即修改數(shù)據(jù)會(huì)操作兩次數(shù)據(jù)庫(kù)。那么有沒有什么方法可以只操作一次數(shù)據(jù)庫(kù)呢?那就是下面要講解的EntityState。
使用EntityState優(yōu)化上面的修改方法:
static void EditAdvance()
{
using (StudentSystemEntities dbContext = new StudentSystemEntities())
{
// 將EF執(zhí)行的SQL語(yǔ)句輸出到控制臺(tái)
dbContext.Database.Log += p => Console.WriteLine(p);
// 創(chuàng)建要修改的對(duì)象
Student stu = new Student()
{
StudentID = 14,
Age = 690
};
// 通過(guò)上下文獲取對(duì)象相關(guān)信息
DbEntityEntry<Student> entry = dbContext.Entry<Student>(stu);
// 對(duì)象的狀態(tài)是沒有修改
entry.State = System.Data.Entity.EntityState.Unchanged;
// 對(duì)象的屬性值A(chǔ)ge修改了
entry.Property("Age").IsModified = true;
// 保存修改 會(huì)智能判斷哪個(gè)對(duì)象的哪個(gè)屬性值修改了
dbContext.SaveChanges();
Console.WriteLine("修改成功");
}
}結(jié)果:

從上面的截圖中不難看出,這次只操作了一次數(shù)據(jù)庫(kù)。
好處:只執(zhí)行一次數(shù)據(jù)庫(kù)操作,不需要查詢了,體現(xiàn)了EF修改的本質(zhì)(通過(guò)實(shí)體對(duì)象的狀態(tài)進(jìn)行修改)。
二、刪除
static void DeleteAdvance()
{
using (StudentSystemEntities dbContext = new StudentSystemEntities())
{
// 將EF執(zhí)行的SQL語(yǔ)句輸出到控制臺(tái)
dbContext.Database.Log += p => Console.WriteLine(p);
// 先查詢?nèi)缓笤趧h除
Student stu = new Student()
{
StudentID = 14
};
DbEntityEntry<Student> entry = dbContext.Entry<Student>(stu);
entry.State = System.Data.Entity.EntityState.Deleted;
// 保存,智能判斷對(duì)象的狀態(tài)
dbContext.SaveChanges();
Console.WriteLine("刪除成功");
}
}結(jié)果:

三、新增數(shù)據(jù)
static void AddAdvance()
{
using (StudentSystemEntities dbContext = new StudentSystemEntities())
{
// 定義Student對(duì)象
Student stu = new Student()
{
StudentName = "花千骨",
Sex = "女",
Age = 3422,
Major = "舞蹈專業(yè)",
Email = "2345678911@qq.com"
};
// 將EF執(zhí)行的SQL語(yǔ)句輸出到控制臺(tái)
dbContext.Database.Log += p => Console.WriteLine(p);
DbEntityEntry<Student> entry = dbContext.Entry<Student>(stu);
entry.State = System.Data.Entity.EntityState.Added;
// 保存的數(shù)據(jù)庫(kù)
dbContext.SaveChanges();
Console.WriteLine("保存成功");
}
}
四、批處理
利用EntityState可以很好的實(shí)現(xiàn)批處理功能,例如下面的例子:增加兩條數(shù)據(jù),修改一條數(shù)據(jù),刪除一條數(shù)據(jù)
static void Save()
{
using (StudentSystemEntities dbContext = new StudentSystemEntities())
{
// 將EF執(zhí)行的SQL語(yǔ)句輸出到控制臺(tái)
dbContext.Database.Log += p => Console.WriteLine(p);
// 新增數(shù)據(jù)1
Student stu1 = new Student()
{
StudentName = "紅孩兒",
Age = 456,
Major = "冶金專業(yè)"
};
dbContext.Students.Add(stu1);
// 新增數(shù)據(jù)2
Student stu2 = new Student()
{
StudentName = "青牛精",
Age = 345,
Major = "煉丹"
};
// 使用狀態(tài)
DbEntityEntry<Student> entry = dbContext.Entry<Student>(stu2);
entry.State = System.Data.Entity.EntityState.Added;
// 修改數(shù)據(jù)
Student stuEdit = new Student()
{
StudentID=5,
Age=678
};
//狀態(tài)
DbEntityEntry<Student> entryEdit = dbContext.Entry<Student>(stuEdit);
entryEdit.State = System.Data.Entity.EntityState.Unchanged;
entryEdit.Property("Age").IsModified = true;
// 刪除數(shù)據(jù)
Student stuDel = new Student()
{
StudentID=22
};
DbEntityEntry<Student> entryDel = dbContext.Entry<Student>(stuDel);
entryDel.State = System.Data.Entity.EntityState.Deleted;
// 保存
dbContext.SaveChanges();
Console.WriteLine("保存成功");
}
}使用EntityState實(shí)現(xiàn)批處理功能,只需要執(zhí)行一次SaveChange()就可以了,如果是使用原來(lái)的方式就需要多次執(zhí)行SaveChange(),這樣可以減少數(shù)據(jù)庫(kù)的操作。
總結(jié):無(wú)論是add、remove、savechanges都是根據(jù)EF包裝實(shí)體的State進(jìn)行相應(yīng)的增刪改操作。
以上所述是小編給大家介紹的Entity Framework根據(jù)實(shí)體的EntityState狀態(tài)實(shí)現(xiàn)增刪改查,希望對(duì)大家有所幫助。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
- Entity?Framework使用DataBase?First模式實(shí)現(xiàn)數(shù)據(jù)庫(kù)的增刪改查
- Entity?Framework生成DataBase?First模式
- Entity Framework使用Code First模式管理事務(wù)
- Entity Framework管理并發(fā)
- Entity Framework使用Code First模式管理存儲(chǔ)過(guò)程
- Entity Framework使用Code First模式管理視圖
- Entity Framework加載控制Loading Entities
- Entity Framework使用LINQ操作實(shí)體
相關(guān)文章
ASP.NET?Core中間件實(shí)現(xiàn)限流的代碼
這篇文章主要介紹了ASP.NET?Core中間件實(shí)現(xiàn)限流的方法,本文通過(guò)示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-03-03
asp.net checkbox 動(dòng)態(tài)綁定id GridView刪除提示
asp.net checkbox 動(dòng)態(tài)綁定id,需要的朋友可以參考下。雖然簡(jiǎn)單但不知道挺麻煩的。GridView刪除提示2009-10-10
.NET或.NET Core Web APi基于tus協(xié)議實(shí)現(xiàn)斷點(diǎn)續(xù)傳的示例
這篇文章主要介紹了.NET或.NET Core Web APi基于tus協(xié)議實(shí)現(xiàn)斷點(diǎn)續(xù)傳的示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11

