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

如何使用Entity Framework实现MessagesTable表数据上传

EF实现MessagesTable数据上传/更新操作指南

你已经在BindGrid方法里成功通过EF查询数据,说明实体数据模型TestDBEntities和MessagesTable的映射已经配置完成,接下来只需要把原生ADO.NET的CRUD逻辑替换成EF写法即可,同时修正现有代码里的资源泄漏问题。

核心操作逻辑

EF操作数据库不需要手动写SQL、管理连接和参数,通用流程固定:

  1. 用using声明DbContext实例(用完自动释放资源,避免连接泄漏)
  2. 对实体对象做新增/查询修改/删除操作
  3. 调用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 22:36:21