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

.NET Framework下Entity Framework更新用户数据时数据库未生效问题

问题核心原因

1. Page_Load 回发未做判断导致控件值被覆盖

你Page_Load中给fname、lname、date控件赋值的逻辑没有用if(!IsPostBack)包裹,点击提交按钮触发回发时,会优先执行Page_Load逻辑,把控件的值重置为数据库/Session存储的旧值,后续Edit_Click事件中拿到的控件Text属性都是旧值,相当于没有修改。
即使这段代码目前是被注释状态,也建议补充IsPostBack判断后再启用,避免后续启用时踩坑。

2. Entity Framework 实体跟踪操作顺序错误、逻辑冗余

你Edit_Click中的EF操作逻辑存在多处错误:

  • 你通过db1.Users.Where(...)查询出来的u实体,本身就处于当前db1上下文的变更跟踪状态,完全不需要手动设置EntityState.Modified,也不需要调用Attach方法,多余的操作反而破坏了EF的跟踪状态
  • 就算要手动标记状态,也应该先修改实体的属性值,再设置Entry.State = EntityState.Modified,你现在先标记状态再改属性,修改后的值不会被同步到状态标记中
  • 改完属性后调用Attach会把实体的状态重置为Unchanged,相当于你之前的修改和状态标记全部失效,SaveChanges自然不会生成更新SQL

修复后的参考代码

using System;
using Email_System.Models;
using System.Data.Entity;

namespace Email_System.Pages
{
    public partial class EditProfile : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            // 仅首次加载页面时赋值,回发时不执行
            if (!IsPostBack)
            {
                if (Session["user"] == null)
                {
                    // 未登录跳转逻辑可自行补充
                    Response.Redirect("Login.aspx");
                    return;
                }
                EmailDbContext db = new EmailDbContext();
                string username = Session["user"].ToString();
                User u = db.Users.Where(b => b.UserName == username).FirstOrDefault();
                if (u != null)
                {
                    fname.Text = u.UserFirstName;
                    lname.Text = u.UserLastName;
                    date.Text = u.DOB.ToString("yyyy-MM-dd");
                }
            }
        }

        protected void Edit_Click(object sender, EventArgs e)
        {
            if (Session["user"] == null)
            {
                Response.Redirect("Login.aspx");
                return;
            }
            EmailDbContext db1 = new EmailDbContext();
            string uname = Session["user"].ToString();
            User u = db1.Users.Where(b => b.UserName == uname).FirstOrDefault();
            if (u == null) return;

            // 直接修改属性即可,EF会自动跟踪变更
            u.UserFirstName = fname.Text.Trim();
            u.UserLastName = lname.Text.Trim();
            if (DateTime.TryParse(date.Text.Trim(), out DateTime dob))
            {
                u.DOB = dob;
            }
            else
            {
                // 可自行补充日期格式错误提示
                return;
            }
            
            // 不需要手动改状态、不需要Attach,直接保存即可
            db1.SaveChanges();

            // 保存成功后再更新Session
            Session["fname"] = u.UserFirstName;
            Session["lname"] = u.UserLastName;
            Session["dob"] = u.DOB.ToString("yyyy-MM-dd");
        }
    }
}

内容的提问来源于stack exchange,提问作者Ronak Padaliya

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 21:24:07