EF直接更新数据(不需查询)

本方法仅适合带主键的表数据更新,以及更新时主键值已知的情况

主要理论基础是:直接将 被修改的实体对象 添加到 EF中管理(此时为附加状态Attached),并手动设置其为未修改状态(Unchanged),同时设置被修改的实体对象 的 包装类对象 对应属性为修改状态。
废话不说,直接上代码

//先New一个实体对象,加入需要修改的属性,加入主键值
CompanyAddr DefaultData = new CompanyAddr
{
	id = 1,
    IsDefault = true //需要修改的值
};

//方法一:实体对象所有属性均有赋值,或者不赋值但存在默认值的,结果将会修改为默认值,或者为null
db..Entry(DefaultData).State = System.Data.EntityState.Modified;

//方法二:实体对象部分属性均赋值
//添加到EF管理容器中,并获取 实体对象 的伪包装类对象
DbEntityEntry entry = db.Entry(DefaultData);
//如果使用 Entry 附加 实体对象到数据容器中,则需要手动 设置 实体包装类的对象 的 状态为 Unchanged**
entry.State = EntityState.Unchanged;    
//标识 实体对象 某些属性 已经被修改了
entry.Property("IsDefault").IsModified = true;

//方法三:
//直接针对属性进行状态设置,但是当前对象并没有被上下文跟踪
contextState.Set().Attach(customerState);
//标识 实体对象 某些属性 已经被修改了
contextState.Entry(customerState).Property("customerName").IsModified = true;

//关键性的注意点来了,这里针对的是方法二、三!
//关闭验证实体有效性(ValidateOnSaveEnabled)这个开关
//因为New的一个新实体对象,里面肯定很多值不会修改,而默认是空的情况;
//再进行SaveChanges的时候,会进行实体验证,这个时候就会出错
//当然,如果是你需要修改的数据输入值真的有问题,也是不能修改成功的,例如上面的IsDefault 不赋值为未布尔型,还是会报错的
db.Configuration.ValidateOnSaveEnabled = false;

db.SaveChanges();

//恢复验证实体有效性(ValidateOnSaveEnabled)这个开关【如果后续有其他操作,记得恢复】
db.Configuration.ValidateOnSaveEnabled = true;

参考文章:
https://www.cnblogs.com/jameszou/archive/2013/03/12/2956281.html
https://www.cnblogs.com/DrHao/p/5255630.html

你可能感兴趣的:(EF直接更新数据(不需查询))