.net5 core Razor 进阶之一:EF Core基本数据操作介绍(单表操作)

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( ) 来使用,用来取查询结果集合中的第一笔或最后一笔。

二、新增学生

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/

posted @ 2021-05-22 17:41  屏风马  阅读(712)  评论(0编辑  收藏  举报