Entity Framework Core对数据库的操作都是基于数据库表对应的类(ORM中称这种类为实体)来进行的,
ORM框架为我们提供了丰富的方法和扩展方法,能非常轻松的完成对数据库的增删改查,
所有这些方法、扩展方法如下(仅针对.NET5,之前或之后的版本可能有变化):
方法:
扩展方法:
下面我们就一些常用操作做具体的应用示例。
模拟场景:管理一个班级的学生和成绩.
学生表 T_Student (主键:stu_id)结构如下
成绩表 T_Score (主键:stu_id + subject_code)结构如下:
说明:‘ 张芷梦 ‘参加了全部2门考试;‘ 刘浩然 ‘ 只考了数学; ‘李明 ‘ 请假缺席了两门考试,没有成绩。
一、查询单个学生
方式1,使用 Single() 方法:
public void OnGet() { int stuId = 1; TStudent student = _context.TStudents.Single(s=>s.StuId==stuId); //如果该 stuId 不存在,会抛参数错误的异常
//TStudent student = _context.TStudents.Single<TStudent>(s=>s.StuId==stuId); // 也可以用泛型方法,但不推荐 }
方式2,使用 SingleOrDefault() 方法:
public void OnGet() { int stuId = 1; TStudent student = _context.TStudents.SingleOrDefault(s=>s.StuId==stuId); //如果该 stuId 不存在,会抛对象为空的异常 }
方式3,使用 Find() 方法:
public void OnGet() { int stuId = 1; TStudent student = _context.TStudents.Find(stuId); //如果该 stuId 不存在,会抛对象为空的异常 }
注:如果表中的主键是多个字段组合,比如成绩表的主键是 stu_id + subject_code 的组合,可以这样写:
TScore score = _context.TScores.Find(1, "YUWEN");
只要按顺序将组成主键的各个值传入就可以了。
-----------------------------------分割线------------------------------------
另外,还有First( )/FirstOrDefault( )、Last( )/LastOrDefault( ) 也可以查询单个实体,
但这2组方法常结合方法 Where<T>( ) 来使用,即从查询出来的集合中取第一笔或最后一笔。
二、新增学生:
public void OnPost() { TStudent student = new TStudent { StuName="张三", ClassCode="4-8", ClassName="四(8)班" }; _context.TStudents.Add(student); _context.SaveChanges(); }
三、修改:
方式1,先将实体查询出来,修改相应的字段后再保存(推荐):
public void OnPost() { int stuId = 1; TStudent student = _context.TStudents.SingleOrDefault(stu => stu.StuId == stuId); //先将要修改的实体查询出来 student.StuName = "张梦燃";//要修改哪个值就直接赋值 _context.SaveChanges(); //保存 }
编译执行后如下图:
方式2,使用 update() 方法(不推荐):
public void OnPost() { TStudent student = new TStudent { StuId = 1, StuName = "张梦然", ClassCode = "6-2", ClassName="六(2)班" }; _context.TStudents.Update(student); _context.SaveChanges(); //保存 }
这种方式需要将每个字段都赋值,如果某个字段没有赋值,会被更新成null,如果恰巧该字段不能为null,则会抛异常。
方式3,使用 Attach(student)方法并设置该实体的状态为已被修改:
public void OnPost() { TStudent student = new TStudent { StuId = 1, StuName = "张梦燃 aa", ClassCode = "5-1 aa", ClassName= "五(1)班 aa" }; _context.TStudents.Attach(student); //将要修改的实体添加到上下文环境 _context.Entry<TStudent>(student).State = EntityState.Modified; //告诉上下文环境该实体已被修改过了,没有这一句将不执行任何操作 _context.SaveChanges(); //保存 }
和方式2一样,每个字段都要赋值,没赋值的字段会被更新成null
方式4,使用 Attach() 搭配 Property() 只修改指定的字段:
public void OnPost() { TStudent student = new TStudent { StuId = 1, StuName = "张梦燃", ClassCode = "5-1", ClassName= "五(1)班" }; _context.TStudents.Attach(student); //将要修改的实体添加到上下文环境 _context.Entry<TStudent>(student).Property(stu => stu.StuName).IsModified = true; //指定修改StuName字段 _context.Entry<TStudent>(student).Property(stu => stu.ClassCode).IsModified = true; //指定修改ClassCode字段 _context.SaveChanges(); //保存 }
虽然4个字段都赋值了,但 ClassName 字段的值不会被修改,编译后执行如下:
四、删除:
public void OnPost() { int stuId = 1; TStudent student = _context.TStudents.SingleOrDefault(stu => stu.StuId == stuId);//先查询出来要删除的实体 _context.TStudents.Remove(student); //删除 _context.SaveChanges(); //保存删除 }
五、查询
5.1 普通查询:
public void OnGet() { List<TStudent> studentList = _context.TStudents.Where(stu => stu.ClassCode == "5-1").ToList(); }
5.2 Like 查询:
public void OnGet() { List<TStudent> studentList = _context.TStudents.Where(stu => stu.StuName.StartsWith("张")).ToList(); // 等效于 like ‘张%‘ //List<TStudent> studentList = _context.TStudents.Where(stu => stu.StuName.EndsWith("明")).ToList(); // 等效于 like ‘%名‘ //List<TStudent> studentList = _context.TStudents.Where(stu => stu.StuName.Contains("梦")).ToList(); // 等效于 like ‘%梦%‘ }
5.3 in 查询
public void OnGet() { List<int> idList = new List<int> {6}; List<TStudent> studentList = _context.TStudents.Where(stu => idList.Contains(stu.StuId)).ToList(); }
六、排序
public void OnGet() { List<TStudent> studentList = _context.TStudents.Where(stu=>stu.ClassCode== "5-1").OrderBy(stu=>stu.StuName).ToList(); // 按姓名顺序排列 //List<TStudent> studentList = _context.TStudents.Where(stu => stu.ClassCode == "5-1").OrderByDescending(stu => stu.StuId).ToList(); //按ID倒序排列 }
OrderBy()-->顺序;OrderByDescending()-->倒序;如果有多个排序字段就调用多次就可以了,如下:
public void OnGet() { List<TStudent> studentList = _context.TStudents.OrderBy(stu=>stu.ClassCode).OrderByDescending(stu => stu.StuId).ToList(); }
----------------------------------------------------
更详细的介绍请参考微软官方文档,地址:https://docs.microsoft.com/zh-cn/ef/core/