• 6、Entity Framework Core 3.1入门教程-删除和修改


    本文章是根据 微软MVP solenovex(杨旭)老师的视频教程编写而来,再加上自己的一些理解。
    视频教程地址:https://www.bilibili.com/video/BV1xa4y1v7rR
    GitHub源码:https://github.com/hllive/LearnEFCore3.1

    删除数据

    EFCore只能删除被Context追踪的数据,数据怎么能被追踪呢,只能先查询出来,然后操作删除方法,删除方法有四种,如代码所示;调用Remove()或RemoveRange()方法后还没有数据库执行动作,只有调用_dbContext.SaveChanges()才会执行数据库事务操作并返回影响行数。

    [HttpDelete]
    public IActionResult DeleteLeague() {
        //先查询出来,因为只能删除被追踪的数据
        var league = _dbContext.Leagues.SingleOrDefault(l => l.Country == "贵州");
        if (league == null) return NotFound();
        //1、单独删除方法
        _dbContext.Leagues.Remove(league);//删除单个Leagues
        _dbContext.Remove(league);//直接在context上Remove()方法传入model,它会判断类型
    
        //2、批量删除方法
        var league2 = _dbContext.Leagues.SingleOrDefault(l => l.Country == "中国");
        _dbContext.Leagues.RemoveRange(league, league2);
        _dbContext.RemoveRange(league, league2);
    
        //执行数据库操作
        int count = _dbContext.SaveChanges();
        return Ok(count);
    }
    

    修改数据

    修改数据与删除数据有点像,也是需要被Context追踪的数据,然后才能进行修改,所追踪的对象里有个状态属性,状态设为Modify,调用SaveChanges()时才会执行相应的修改,修改某个字段后,context就知道某个字段已经被修改。

    [HttpPut]
    public IActionResult UpdateLeague() {
        //先查询出来,因为操作被追踪的数据
        var league = _dbContext.Leagues.FirstOrDefault();
        //修改Name属性,被追踪的league状态属性就会变为Modify
        league.Name += "-";
        //执行数据库操作
        int count = _dbContext.SaveChanges();
        return Ok(count);
    }
    


    根据执行结果可以看出,只修改了Name字段,这就是因为EFCore追踪的数据,League类的name值改变了,所以才执行修改Name字段。

    如果修改多条记录,也就是修改集合数据,这时候EFCore就会生成集合数量的UPATE的SQL语句,如果有100条数据需要修改,EFCore就会生成100条UPATE的SQL语句。这种修改方法不太适合我们的业务场景。

    在实际情况中,对象不一定是从数据库中查询出来的,而是由前端传入的JSON数据。这时候就不能被EFCore追踪,可以使用context.Update()方法进行数据追踪

    通过context查询出来的数据都会被EFCore变化追踪的,进行变化追踪可能会消耗大类的内存或CPU处理,如果查询量比较大,而且不需要变化追踪,可以通过AsNoTracking()方法使对象不被EFcore追踪,例如:_dbContext.Leagues.AsNoTracking().FirstOrDefault();。在AsNoTracking()后也需要执行First()或ToList()才会真正执行数据库查询。

    [HttpPut("test")]
    public IActionResult UpdateLeague2()
    {
        //var league = _dbContext.Leagues.AsNoTracking().FirstOrDefault();
        //这里模拟前端传过来的JSON数据序列化为对象
        var league = new League {
            Id = new Guid("EDAAEE79-78C9-43B5-A924-08D845203D11"),
            Name= "贵州贵阳足球联赛"
        };
        //修改对象的属性
        league.Name = league.Name.Replace("贵州贵阳", "遵义仁怀");
        //让context进行追踪,并知道它已经被修改
        _dbContext.Leagues.Update(league);
        //执行数据库操作
        int count = _dbContext.SaveChanges();
        return Ok(count);
    }
    


    这种离线的数据(没有被追踪)使用context.Update()方法执行时,EFCore不知道那些属性或字段已经被修改那些没有被修改。这种生成的SQL语句会把所有字段都重新赋值一遍,如果没有赋值会被设置为NULL,如上图执行结果,Country属性本来没有修改,执行SQL语句时被设置为NULL
    如果只想修改某一个属性的话也是可以做到的,以后再写。。。

    博客文章可以转载,但不可以声明为原创

  • 相关阅读:
    if __name__ == '__main__' 该如何理解
    Github下载慢和下载过程中断等情况的解决方案
    Git下载安装及设置详细教程
    冒烟测试是什么?
    100道MySQL数据库经典面试题解析
    Linux 下ZooKeeper安装
    运用Docker+Jenkins+Nginx+Spring Boot 自动化部署项目
    linux本地远程上传&下载阿里云oss的shell脚本实现方法
    运行java项目shell简洁脚本
    阿里云oss利用工具上传图片文件
  • 原文地址:https://www.cnblogs.com/hllive/p/13541330.html
Copyright © 2020-2023  润新知