.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
相关产品推荐
相关产品推荐

