当你使用这个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(实体)来更新个别数据,效率和开销上更优吧!初级教程就这么多了,欢迎大神们批评指正,也感谢很多被借鉴的文章。