當你使用這個DbSet.Update
方法時,實體框架將你實體的所有屬性標記爲EntityState.Modified
,所以跟蹤它們。如果你只想更改部分屬性,而不是全部屬性,請使用DbSet.Attach
。
首先看一下我們province表中的數據。
方式一,使用Attach更新某個屬性的值(注意,不是所有的屬性都作修改)
緊接着上一節的內容,我們在HomeController中添加修改代碼,看下DbSet.Attach(實體)所做的修改。
//四、DbSet.Attach(實體)與DbContext.Entry(實體).State = EntityState.Modified 區別
//DbSet.Attach(實體)
var proAttach = _context.Provinces.Where(p => p.Name == "上海").FirstOrDefault();
if (proAttach != null)
{
proAttach.Population = 10;
_context.Provinces.Attach(proAttach);
}
_context.SaveChanges();
我們看一下局部變量是啥,更新語句是什麼,只有Population屬性被修改。
數據庫達到預期的變化:Population變成10了。
接下來,看一下DbContext.Entry(實體).State = EntityState.Modified操作的變化
頁面頭首先添加引用using Microsoft.EntityFrameworkCore;
//DbContext.Entry(實體).State = EntityState.Modified操作
var proAttach = _context.Provinces.Where(p => p.Name == "上海").FirstOrDefault();
if (proAttach != null)
{
proAttach.Population = 20;
_context.Entry(proAttach).State = EntityState.Modified;
}
_context.SaveChanges();
我們看一下更新語句,除了ID外的所有屬性都被修改。
我們看下數據庫的變化,達到預期的效果:Name爲“上海”的數據行的population屬性值變成20。
看來這2個語句應該是使用DbSet.Attach(實體)來更新個別數據,效率和開銷上更優吧!初級教程就這麼多了,歡迎大神們批評指正,也感謝很多被借鑑的文章。