ASP.NET EF6多表数据保存异常:ConcremoteDevice表Active字段无法写入
看起来你遇到的问题是ConcremoteDevice表的Active字段单独无法保存,其他字段和DeviceStatus表都正常,这大概率是几个常见的小问题导致的,我帮你一步步排查:
你控制器里的[Bind(Include = "...")]是白名单机制,只有列出来的字段才会被ASP.NET MVC绑定到模型上。从你贴的代码末尾看到Activ...,很可能是你没把完整的Active字段名加到Include列表里。比如应该修改成:
[Bind(Include = "id,DeviceConfig_id,Device_statustypes_id,ConcremoteDevice_id,Employee_1,Employee_2,Sign_Date,Active,...")]
如果漏了这个字段,后端就不会接收前端传来的Active值,自然无法保存到数据库。
检查你的Edit视图里,对应Active字段的表单控件是否有正确的name属性,要和模型里的Active字段名完全一致。比如如果是复选框:
@Html.CheckBoxFor(m => m.Active)
如果是手动编写的HTML,要确保name属性正确:
<input type="checkbox" name="Active" id="Active" @(Model.Active ? "checked" : "") />
如果前端没传这个字段,或者name不匹配,后端接收不到值,保存时自然不会更新。
看看你的ConcremoteDevice模型里,Active字段的定义有没有问题:
- 有没有被
[ReadOnly(true)]这类阻止绑定的特性标记? - 如果是可空布尔类型(
bool?),前端是否可能没传值导致null?不过普通bool类型会默认有false值,一般不会有这个问题。 - 确认EF的映射是否和数据库字段匹配:比如数据库里是bit类型,模型里是bool类型,两者要对应上。
如果你是手动处理ConcremoteDevice实体的保存,而不是直接依赖模型绑定后的自动更新,要确认你有没有把模型里的Active值赋值给数据库实体。比如:
var concremoteDevice = db.ConcremoteDevice.Find(model.ConcremoteDevice_id); // 一定要确保这里给Active字段赋值 concremoteDevice.Active = model.Active; // 其他字段赋值... db.SaveChanges();
如果漏了这一行赋值,自然不会更新Active字段。
最后可以检查下ConcremoteDevice表的Active字段有没有设置只读约束、默认值触发器,或者其他会自动覆盖字段值的数据库机制?不过这种情况比较少见,建议先排查前面的几点。
你可以先从第一点开始检查,Bind白名单漏字段是最常见的原因。如果还是解决不了,可以把模型里的Active字段定义、视图里的表单代码,还有完整的保存逻辑贴出来,我再帮你进一步分析。
内容的提问来源于stack exchange,提问作者Luca

