C#中LINQ to SQL实现数据增删改查操作
在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步:初始化与查询配置
目的:建立数据库连接上下文并提供数据读取能力。
操作:在类中声明
private PL_ModelDataContext db = new PL_ModelDataContext();。通过db.User_ALL直接返回实体集以实现全表查询,或使用SingleOrDefault根据ID精确查找。 -
第2步:执行新增与删除操作
目的:将对象标记为待处理状态。
操作:
- 新增:调用
db.User_ALL.InsertOnSubmit(user)。 - 删除:调用
db.User_ALL.DeleteOnSubmit(user)。
注意:此时数据尚未真正写入数据库。
- 新增:调用
-
第3步:处理更新逻辑
目的:同步内存对象属性到数据库记录。
操作:使用
SingleOrDefault检索现有记录。如果记录存在(editStudent != null),手动将传入对象的属性(如UserName,Address)复制到数据库记录对象上。最后调用db.SubmitChanges()提交更改。 -
第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框架的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









