[C#.NET][Entity Framework] Update Record
開發環境
- Windows 8.1 x64
- EF 6.1.3, Code First from Database
- 資料庫 http://msftdbprodsamples.codeplex.com/releases/view/55330
場景:
使用EF DbContext 更新資料庫
實作:
從資料庫取得 Entity,然後變更狀態,從某個物件Copy到另一個物件,下面 Hard Code 的寫法是最簡單的
{ using (var db = new AdventureWorks2012DbContext()) { var fromDB = db.People.Find(person.BusinessEntityID); fromDB.FirstName = person.FirstName; fromDB.LastName = person.FirstName; fromDB.EmailPromotion = person.EmailPromotion; var result = db.SaveChanges(); return result; } }
欄位太多,Hard Code 就不是那麼聰明,可以利用 db.Entry(fromDB).CurrentValues.SetValues(person) 來處理
{ using (var db = new AdventureWorks2012DbContext()) { var fromDB = db.People.Find(person.BusinessEntityID); db.Entry(fromDB).CurrentValues.SetValues(person); var result = db.SaveChanges(); return result; } }
既然已經知道 Entity 的狀態,就不需要再訪問一次資料庫,若 Entity 的狀態無法通過 EF 以及資料庫的驗証,下面的寫法可能會跳出例外,這時候要根據例外補足欠缺的欄位訊息
{ using (var db = new AdventureWorks2012DbContext()) { //db.People.Attach(person); db.Entry(person).State = EntityState.Modified; var result = db.SaveChanges(); return result; } }
某些場景可能只需要更新一個欄位
- 該 People 資料表有四個必填欄位,PK一定要有,也就是 BusinessEntityID ,FirstName 則是我要更新的欄位,建立 Person 物件時,必須要先通過 EF 的檢查,其餘的 PersonType 、LastName 也一定要填,而且不能為空字串
- 透過 IsModified 就可只產生特定欄位 T-SQL 語法
{ using (var db = new AdventureWorks2012DbContext()) { var person = new Person() { BusinessEntityID = id, FirstName = firstName, PersonType = "EF", LastName = "EF 會檢查必填欄位,所以要填寫,它不會產生T-SQL" }; db.People.Attach(person); db.Entry(person).Property(p => p.FirstName).IsModified = true; var result = db.SaveChanges(); return result; } }
想要略過 EF 檢查也是可以的,設定 db.Configuration.ValidateOnSaveEnabled = false;
這樣就不需要處理其他的必填欄位
{ using (var db = new AdventureWorks2012DbContext()) { db.Configuration.ValidateOnSaveEnabled = false; var person = new Person() { BusinessEntityID = id, FirstName = firstName }; db.People.Attach(person); db.Entry(person).Property(p => p.FirstName).IsModified = true; var result = db.SaveChanges(); return result; } }
文章出自:http://www.dotblogs.com.tw/yc421206/archive/2015/05/02/151197.aspx
若有謬誤,煩請告知,新手發帖請多包涵
Microsoft MVP Award 2010~2017 C# 第四季
Microsoft MVP Award 2018~2022 .NET