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

從上面的截圖中可以看出,查詢數(shù)據(jù)的時候會執(zhí)行一次事物,修改的時候又執(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;
// 保存修改 會智能判斷哪個對象的哪個屬性值修改了
dbContext.SaveChanges();
Console.WriteLine("修改成功");
}
}結(jié)果:

從上面的截圖中不難看出,這次只操作了一次數(shù)據(jù)庫。
好處:只執(zhí)行一次數(shù)據(jù)庫操作,不需要查詢了,體現(xiàn)了EF修改的本質(zhì)(通過實體對象的狀態(tài)進行修改)。
二、刪除
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可以很好的實現(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實現(xiàn)批處理功能,只需要執(zhí)行一次SaveChange()就可以了,如果是使用原來的方式就需要多次執(zhí)行SaveChange(),這樣可以減少數(shù)據(jù)庫的操作。
總結(jié):無論是add、remove、savechanges都是根據(jù)EF包裝實體的State進行相應(yīng)的增刪改操作。
以上所述是小編給大家介紹的Entity Framework根據(jù)實體的EntityState狀態(tài)實現(xiàn)增刪改查,希望對大家有所幫助。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
相關(guān)文章
asp.net checkbox 動態(tài)綁定id GridView刪除提示
asp.net checkbox 動態(tài)綁定id,需要的朋友可以參考下。雖然簡單但不知道挺麻煩的。GridView刪除提示2009-10-10
.NET或.NET Core Web APi基于tus協(xié)議實現(xiàn)斷點續(xù)傳的示例
這篇文章主要介紹了.NET或.NET Core Web APi基于tus協(xié)議實現(xiàn)斷點續(xù)傳的示例,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11

