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

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

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

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

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

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

//方法三:
//直接针对属性进行状态设置,但是当前对象并没有被上下文跟踪
contextState.Set<CustomerInfo>().Attach(customerState);
//标识 实体对象 某些属性 已经被修改了
contextState.Entry<CustomerInfo>(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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值