如何使用Entity Framework实现MessagesTable表数据上传
EF实现MessagesTable数据上传/更新操作指南
你已经在BindGrid方法里成功通过EF查询数据,说明实体数据模型TestDBEntities和MessagesTable的映射已经配置完成,接下来只需要把原生ADO.NET的CRUD逻辑替换成EF写法即可,同时修正现有代码里的资源泄漏问题。
核心操作逻辑
EF操作数据库不需要手动写SQL、管理连接和参数,通用流程固定:
- 用
using声明DbContext实例(用完自动释放资源,避免连接泄漏) - 对实体对象做新增/查询修改/删除操作
- 调用
SaveChanges()方法把变更提交到数据库
修正后的页面代码
先删掉类里冗余的ADO.NET相关变量:ConnStr、SqlConnection con都不需要保留,EF会自动读取配置文件里的连接字符串。
public partial class UsersEF : System.Web.UI.Page { int SelectedID = 0; protected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e) { // 拿到要更新的记录ID SelectedID = int.Parse(e.NewValues["Id"].ToString()); using (var context = new TestDBEntities()) { // 查询要更新的目标记录 var msgItem = context.MessagesTable.FirstOrDefault(m => m.Id == SelectedID); if (msgItem == null) { e.Cancel = false; return; } // 直接给实体属性赋值,EF会跟踪变更 msgItem.From = e.NewValues["From"].ToString(); msgItem.To = e.NewValues["To"].ToString(); msgItem.Title = e.NewValues["Title"].ToString(); msgItem.Message = e.NewValues["Message"].ToString(); // 提交变更到数据库 int affectRows = context.SaveChanges(); if (affectRows > 0) { e.Cancel = true; GridView1.EditIndex = -1; BindGrid(); } else { e.Cancel = false; } } } protected void GridView1_RowEditing(object sender, GridViewEditEventArgs e) { GridView1.EditIndex = e.NewEditIndex; SelectedID = int.Parse(GridView1.Rows[e.NewEditIndex].Cells[0].Text); BindGrid(); } protected void GridView1_RowCancelingEdit(object sender, GridViewCancelEditEventArgs e) { e.Cancel = true; GridView1.EditIndex = -1; BindGrid(); } protected void GridView1_SelectedIndexChanged(object sender, EventArgs e) { SelectedID = int.Parse(GridView1.SelectedRow.Cells[0].Text); BindGrid(); } protected void Page_Load(object sender, EventArgs e) { // 删掉原来手动开SqlConnection的逻辑,EF自动管理连接 if (!Page.IsPostBack) { BindGrid(); } } public void BindGrid() { using (var context = new TestDBEntities()) { GridView1.DataSource = context.MessagesTable.ToList(); GridView1.DataBind(); } } // 新增/上传数据的方法,绑定到你的提交按钮点击事件即可 protected void btnSubmit_Click(object sender, EventArgs e) { using (var context = new TestDBEntities()) { // 新建一条消息实体 var newMsg = new MessagesTable() { From = txtFrom.Text.Trim(), To = txtTo.Text.Trim(), Title = txtTitle.Text.Trim(), Message = txtMessage.Text.Trim() }; // 加入上下文跟踪 context.MessagesTable.Add(newMsg); // 提交到数据库 context.SaveChanges(); // 刷新列表 BindGrid(); } } }
注意事项
- 你原来的代码里写了两个重复的
RowEditing事件,删掉冗余的那个即可,避免事件重复触发 - 所有DbContext实例都要用
using包裹,不要创建页面级的长生命周期上下文,也不要保留原来的手动SqlConnection逻辑,否则会出现连接池占满、数据更新不及时等问题 - EF会自动生成参数化SQL,不需要手动给参数赋值,从根源上避免SQL注入风险
- 如果你的
From、To字段因为是SQL关键字导致映射报错,只需要在实体类的对应属性上加[Column("From")]特性标注实际列名即可,你现在能正常查询数据说明映射已经配置正确,不需要额外调整
内容的提问来源于stack exchange,提问作者Maya
相关产品推荐
相关产品推荐

