[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