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

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

從上面的截圖中不難看出,這次只操作了一次數(shù)據(jù)庫。
好處:只執(zhí)行一次數(shù)據(jù)庫操作,不需要查詢了,體現(xiàn)了EF修改的本質(zhì)(通過實(shí)體對象的狀態(tài)進(jìn)行修改)。
二、刪除
static void DeleteAdvance()
{
using (StudentSystemEntities dbContext = new StudentSystemEntities())
{
// 將EF執(zhí)行的SQL語句輸出到控制臺
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;
// 保存,智能判斷對象的狀態(tài)
dbContext.SaveChanges();
Console.WriteLine("刪除成功");
}
}結(jié)果:

三、新增數(shù)據(jù)
static void AddAdvance()
{
using (StudentSystemEntities dbContext = new StudentSystemEntities())
{
// 定義Student對象
Student stu = new Student()
{
StudentName = "花千骨",
Sex = "女",
Age = 3422,
Major = "舞蹈專業(yè)",
Email = "2345678911@qq.com"
};
// 將EF執(zhí)行的SQL語句輸出到控制臺
dbContext.Database.Log += p => Console.WriteLine(p);
DbEntityEntry<Student> entry = dbContext.Entry<Student>(stu);
entry.State = System.Data.Entity.EntityState.Added;
// 保存的數(shù)據(jù)庫
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語句輸出到控制臺
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()就可以了,如果是使用原來的方式就需要多次執(zhí)行SaveChange(),這樣可以減少數(shù)據(jù)庫的操作。
總結(jié):無論是add、remove、savechanges都是根據(jù)EF包裝實(shí)體的State進(jìn)行相應(yīng)的增刪改操作。
以上所述是小編給大家介紹的Entity Framework根據(jù)實(shí)體的EntityState狀態(tài)實(shí)現(xiàn)增刪改查,希望對大家有所幫助。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
相關(guān)文章
基于?.NET?6?的ASP.NET?Core啟動地址配置方法及優(yōu)先級順序
這篇文章主要介紹了ASP.NET?Core啟動地址配置方法及優(yōu)先級順序,?.NET?6?使用了最小?WEB?API,?配置方式已經(jīng)部分發(fā)生了變化,下面文章我們來看看具體的方法,需要的小伙伴可以參考一下2022-03-03
.Net彈性和瞬態(tài)故障處理庫Polly實(shí)現(xiàn)執(zhí)行策略
這篇文章介紹了.Net彈性和瞬態(tài)故障處理庫Polly實(shí)現(xiàn)執(zhí)行策略的方法,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-06-06
Asp.net Core 如何設(shè)置黑白名單(路由限制)
本文主要介紹了Asp.net Core 如何設(shè)置黑白名單(路由限制),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-08-08
在?.NET?中使用?FixedTimeEquals?應(yīng)對計(jì)時(shí)攻擊的例子
在計(jì)算機(jī)安全中,計(jì)時(shí)攻擊(Timing attack)是旁道攻擊 (Side-channel attack) 的一種,而旁道攻擊是根據(jù)計(jì)算機(jī)處理過程發(fā)出的信息進(jìn)行分析,這篇文章主要介紹了在?.NET?中使用?FixedTimeEquals?應(yīng)對計(jì)時(shí)攻擊,需要的朋友可以參考下2022-06-06
DotNetCore深入了解之HttpClientFactory類詳解
這篇文章主要給大家介紹了關(guān)于DotNetCore深入了解之HttpClientFactory類的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-03-03
asp.net用url重寫URLReWriter實(shí)現(xiàn)任意二級域名 新
最近有個(gè)朋友要做url重寫的東西,我?guī)退伺?回頭看當(dāng)年自己寫的那個(gè)文章,當(dāng)時(shí)以為自己寫的很容易理解.但現(xiàn)在再看卻覺得寫的不好.而今天百度了一下urlrewriter發(fā)現(xiàn)我這個(gè)文章竟然排第二.為了方便更多朋友,我再寫點(diǎn)東西補(bǔ)充下.2009-11-11
為TextBox裝飾水印與(blur和focus)事件應(yīng)用
為了界面的美觀,有些時(shí)候可能需要為文本框(TextBox)裝飾個(gè)水印;它有兩種狀態(tài),一是blur和focus。因此,我們可以在Javascript寫兩個(gè)事件,感興趣的朋友可以了解下2013-01-01

