You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 15:27:11