C#中LINQ to SQL实现数据增删改查操作

键盘旁的猫
键盘旁的猫
发布时间:2026-10-14| 5人浏览过
原创

在C#开发中,利用LINQ to SQL可以快速实现对象与关系数据库之间的映射操作。本文将通过一个完整的三层架构示例,展示如何定义数据抽象层、实现具体的数据访问类(DAL),以及在MVC控制器中调用这些方法进行数据的添加、更新和删除,帮助开发者理解并应用这一经典ORM模式。

设计抽象数据访问层

为了保证代码的规范性和可扩展性,通常先定义一个抽象类来声明通用的数据操作方法。该抽象类定义了查询单个用户、获取所有用户列表以及执行新增、更新、删除和保存操作的接口。

public abstract class AbUserAll
{
    public abstract IQueryable<User_ALL> FindUserAll();
    public abstract User_ALL FindUserAllById(int userid);
    public abstract void Add(User_ALL user);
    public abstract void Update(User_ALL user);
    public abstract void Delete(User_ALL user);
    public abstract void Save();
}

实现具体数据访问逻辑 (DAL)

创建具体的 UserDal 类并继承上述抽象类。核心在于初始化 PL_ModelDataContext 数据库上下文对象,并通过它提供的 API 对 db.User_ALL 集合进行操作。以下是具体实现:

  1. 第1步:初始化与查询配置

    目的:建立数据库连接上下文并提供数据读取能力。

    操作:在类中声明 private PL_ModelDataContext db = new PL_ModelDataContext();。通过 db.User_ALL 直接返回实体集以实现全表查询,或使用 SingleOrDefault 根据ID精确查找。

  2. 第2步:执行新增与删除操作

    目的:将对象标记为待处理状态。

    操作:

    • 新增:调用 db.User_ALL.InsertOnSubmit(user)。
    • 删除:调用 db.User_ALL.DeleteOnSubmit(user)。

    注意:此时数据尚未真正写入数据库。

  3. 第3步:处理更新逻辑

    目的:同步内存对象属性到数据库记录。

    操作:使用 SingleOrDefault 检索现有记录。如果记录存在(editStudent != null),手动将传入对象的属性(如 UserName, Address)复制到数据库记录对象上。最后调用 db.SubmitChanges() 提交更改。

  4. 第4步:统一提交保存

    目的:将所有挂起的增删改操作写入数据库。

    操作:在任何修改完成后,必须调用 db.SubmitChanges()。这对应于 Save() 方法的实现。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace WF.Models.DAL
{
    public class UserDal:IDAL.AbUserAll
    {
        private PL_ModelDataContext db = new PL_ModelDataContext();

        // 查询所有用户
        public override IQueryable<User_ALL> FindUserAll()
        {
            return db.User_ALL;
        }

        // 按ID查询用户
        public override User_ALL FindUserAllById(int userid)
        {
            return db.User_ALL.SingleOrDefault(o => o.INT == userid);
        }

        // 插入新用户
        public override void Add(User_ALL user)
        {
            db.User_ALL.InsertOnSubmit(user);
        }

        // 标记删除用户
        public override void Delete(User_ALL user)
        {
            db.User_ALL.DeleteOnSubmit(user);
        }

        // 更新用户信息
        public override void Update(User_ALL user)
        {
            var editStudent = db.User_ALL.SingleOrDefault<User_ALL>(s => s.INT == user.INT);
            if (editStudent != null)
            {
                editStudent.UserName = user.UserName;
                editStudent.Address = user.Address;
            }
            // 在Update内部也可以直接SubmitChanges,但为了保持事务一致性,通常由控制器或外层统一调用Save
            db.SubmitChanges(); 
        }

        // 统一保存方法
        public override void Save()
        {
            db.SubmitChanges();
        }
    }
}

MVC 控制器中的业务调用

在 Controller 中实例化 UserDal,通过 Action 方法接收用户请求并执行相应的 CRUD 操作。这种解耦方式使得视图层无需关心底层数据存储细节。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace WF.Controllers
{
    public class UserController : Controller
    {
        Models.DAL.UserDal dbuser = new Models.DAL.UserDal();

        // 1. 显示用户列表
        public ActionResult UserList()
        {
            return View(dbuser.FindUserAll());
        }

        // 2. GET: 显示创建表单
        public ActionResult Create()
        {
            return View();
        }

        // 3. POST: 处理新增数据
        [HttpPost]
        public ActionResult Create(FormCollection collection, Models.User_ALL user)
        {
            try
            {
                dbuser.Add(user);       // 标记插入
                dbuser.Save();          // 提交数据库
                return RedirectToAction("UserList");
            }
            catch
            {
                return View();
            }
        }

        // 4. GET: 编辑界面加载
        public ActionResult UserEdit(int id)
        {
            return View(dbuser.FindUserAllById(id));
        }

        // 5. POST: 处理更新数据
        [HttpPost]
        public ActionResult UserEdit(Models.User_ALL user, FormCollection collection)
        {
            try
            {
                dbuser.Update(user);    // 执行属性赋值与更新
                dbuser.Save();          // 再次确认保存(若Update内未保存)
                return RedirectToAction("UserList");
            }
            catch
            {
                return View();
            }
        }
    }
}

关键注意事项与排错

  • 事务一致性:在执行多个相关操作时,建议在外层统一调用 SubmitChanges 以保证原子性,避免部分成功部分失败的数据不一致。
  • 空值检查:在进行删除或更新前,最好确认对象不为 null。虽然 LINQ to SQL 会在运行时抛出错误,但在业务逻辑层提前判断能提升稳定性。
  • 异常捕获:数据库写入可能因约束冲突、类型不匹配等抛出异常。务必在 [HttpPost] 方法中使用 try-catch 块包裹逻辑,确保出现错误时能回退并重试或返回正确的错误提示视图。
  • 命名空间引用:确保引入 System.Data.Linq 以使用 DataContext 系列功能。

以上就是C#中LINQ to SQL数据增删改查的详细内容,更多关于C# Entity Framework ORM框架的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。