[C#.NET][Entity Framework] Update Record

[C#.NET][Entity Framework] Update Record

開發環境

  1. Windows 8.1 x64
  2. EF 6.1.3, Code First from Database
  3. 資料庫 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;
    }
}

 

某些場景可能只需要更新一個欄位

  1. 該 People 資料表有四個必填欄位,PK一定要有,也就是 BusinessEntityID ,FirstName 則是我要更新的欄位,建立 Person 物件時,必須要先通過 EF 的檢查,其餘的 PersonType 、LastName 也一定要填,而且不能為空字串
  2. 透過 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

Image result for microsoft+mvp+logo