Entity Framework更新数据时状态为Unchanged无法保存求助
问题解决:EF实体状态为Unchanged无法更新记录
问题代码
public string UpdateCateter(string json) { try { jss.MaxJsonLength = 900000000; conexion.Configuration.ValidateOnSaveEnabled = false; conexion.Configuration.AutoDetectChangesEnabled = false; conexion.Configuration.LazyLoadingEnabled = false; conexion.Configuration.ProxyCreationEnabled = false; dynamic newValues = jss.DeserializeObject(json); int codigo = Convert.ToInt32(newValues["id"]); cateter_mahurka_web data = conexion.cateter_mahurka_web.Find(codigo); if (data != null) { foreach (var property in data.GetType().GetProperties()) { var newValue = newValues[property.Name]; if (newValue != null) { var rspre3 = property.SetValue(data, Convert.ChangeType(newValue, property.PropertyType)); var rspre1 = conexion.Entry(data).State; } } var rspre = conexion.Entry(data).State; var rs = conexion.SaveChanges(); return jss.Serialize(rs > 0); } return jss.Serialize("No se encontro ningun registro"); } #region catch... }
问题描述
我正在尝试用Entity Framework更新数据库记录,编写了上述UpdateCateter方法:先将JSON反序列化为newValues对象,通过指定ID从数据库查询得到data对象,遍历data的属性并将newValues中对应非空属性值赋值给data,最后调用SaveChanges保存更改。预期该方法能更新数据库记录并返回操作结果,但实际在执行var rspre = conexion.Entry(data).State;时,实体状态为Unchanged,导致无法保存更新。
原因分析
问题根源是你关闭了AutoDetectChangesEnabled配置。Entity Framework默认会自动检测实体属性的变更,从而将实体状态切换为Modified,但该配置被关闭后,EF无法感知到你手动修改的属性值,因此实体状态始终保持Unchanged,不会触发数据库更新。
解决方案
方案1:开启自动变更检测
如果没有特殊需求,直接移除或注释掉关闭自动检测的代码:
// conexion.Configuration.AutoDetectChangesEnabled = false;
或者在属性赋值完成后,手动触发一次变更检测:
// 在foreach循环结束后、SaveChanges之前添加 conexion.ChangeTracker.DetectChanges();
方案2:手动标记实体为Modified
在遍历赋值完成后,直接将实体状态设置为Modified,强制EF执行全字段更新:
// 在foreach循环结束后添加 conexion.Entry(data).State = System.Data.Entity.EntityState.Modified;
方案3:手动标记单个属性为Modified
若只想更新实际变更的属性(而非全字段),可在每次属性赋值后,通知EF该属性已修改:
// 在property.SetValue代码后添加 conexion.Entry(data).Property(property.Name).IsModified = true;
额外提示
代码中的catch块未完成,建议补全异常处理逻辑,避免未捕获异常导致程序异常终止。
内容的提问来源于stack exchange,提问作者EagleDLuis
相关产品推荐
相关产品推荐

