ASP.NET C#:EF更新MySQL数据库受阻求助
可能导致EF更新MySQL失败的其他因素
以下是一些容易被忽略的、可能阻止数据库更新的原因:
- 实体主键未正确配置:检查
Good类的Id属性是否用[Key]特性标记,或者在Fluent API中配置为主键。EF如果无法识别主键,会无法生成正确的Update语句,也无法跟踪实体的变更。 - 输入数据与原数据无差异:如果
GetInput()返回的所有属性值都和数据库中现有记录完全一致,EF的变更检测机制会判定没有修改,不会执行Update操作。可以在db.SaveChanges()前添加调试代码,对比theGood的当前值与数据库原始值。 - 未检查
SaveChanges()返回值:SaveChanges()会返回受影响的行数,添加代码输出这个值(比如var affectedRows = db.SaveChanges();),如果返回0,说明EF认为没有需要更新的记录,这时候可以排查变更检测是否生效。 - 数据库层面的限制:
- 数据库表存在触发器,在更新时自动重置了字段值;
- 存在外键约束、唯一约束或其他业务规则,导致更新被静默回滚(部分情况下MySQL可能不会抛出异常,需查看数据库日志);
- 目标行被其他事务锁定,导致更新无法提交。
- EF变更检测被禁用:检查
GoodContext的构造函数或配置中是否设置了this.Configuration.AutoDetectChangesEnabled = false;,如果禁用了自动变更检测,EF不会主动识别实体的修改。 - 实体属性访问权限问题:
Good类中被修改的属性是否有公共的setter?如果属性是只读(只有getter),EF无法修改其值,也不会触发更新。 - 上下文跟踪状态异常:虽然你通过
ToList()加载了实体,但如果在加载后有其他操作(比如序列化/反序列化)导致实体脱离了上下文的跟踪,EF不会感知到修改。可以在修改前用db.Entry(theGood).State查看当前跟踪状态,确认是否为Unchanged。
附上你的代码供参考:
protected void btnRedeemEdit_Click(object sender, EventArgs e) { if (!string.IsNullOrEmpty(Request.QueryString["id"])) { var db = new GoodContext(); var goods = db.Goods.ToList(); Good theGood = goods.FirstOrDefault(x => x.Id == int.Parse(Request.QueryString["id"])); //db.Goods.Attach(theGood);//No effect //db.Entry(theGood).State = System.Data.Entity.EntityState.Modified; //No effect if (theGood != default) { theGood.AmountSold = GetInput().AmountSold; theGood.APF = GetInput().APF; theGood.Barcode = GetInput().Barcode; theGood.Description = GetInput().Description; theGood.ImagesUrl = GetInput().ImagesUrl;//"https://i.pinimg.com/564x/2d/b7/d8/2db7d8c53b818ce838ad8bf6a4768c71.jpg"; theGood.Name = GetInput().Name; theGood.OrderPrice = GetInput().OrderPrice; theGood.Profit = GetInput().Profit; theGood.RecievedOn = GetInput().RecievedOn;//DateTime.Parse(GetInput().RecievedOn).Date.ToString(); theGood.TotalAmount = GetInput().TotalAmount; theGood.WeightKg = GetInput().WeightKg; //SetGoodValues(goods[editIndex],GetInput());//Non-working db.SaveChanges(); Response.Redirect("/AdminGoods"); } else Response.Write($"<script>alert('Good on ID does not exist');</script>"); } else Response.Write($"<script>alert('Unable to change: element selected does not exist');</script>"); }
内容的提问来源于stack exchange,提问作者GeekProgrammer
相关产品推荐
相关产品推荐

