翼度科技»论坛 编程开发 .net 查看内容

试试这 6 个小技巧,提升 EF Core 性能

4

主题

4

帖子

12

积分

新手上路

Rank: 1

积分
12

Entity FrameWork(简称 EF)以面向对象的方式操作数据库给开发人员带来了很大的便利性,但其性能问题从面世以来就一直就被广大的 .NET 生态开发技术人员所吐槽,然而,它真的那么不堪使用吗?试试下面这 6 个小技巧,瞬间极大提升 EF Core 性能:

  • AsNoTracking
    在项目开发的时候,如果查询出来的对象不会被修改、删除等,那么在查询的时候,可以启用AsNoTracking,这样就能降低EF Core的资源占用
    1. Book[] books = ctx.Books.AsNoTracking().Take(3).ToArray();
    2. Book b1 = books[0];
    3. b1.Title = "abc";
    4. EntityEntry entry1 = ctx.Entry(b1);
    5. Console.WriteLine(entry1.State);
    复制代码
  • 通过一条SQL语句高效更新实体类
    1. Book b1 = new Book {Id=10};
    2. b1.Title = "yzk";
    3. var entry1 = ctx.Entry(b1);                //直接创建实体对象
    4. entry1.Property("Title").IsModified = true;                //标记 Title 字段被修改
    5. Console.WriteLine(entry1.DebugView.LongView);
    6. ctx.SaveChanges();        //只生成这个字段的更新的SQL语句
    复制代码
  • 用一条SQL语句高效删除数据
    1. Book b1 = new Book { Id = 28 };
    2. ctx.Entry(b1).State = EntityState.Deleted;
    3. ctx.SaveChanges();
    复制代码
  • 关于 Find 和 FindAsync 方法
    Find 或者 FindAsync 方法(以下简称为Find)会先在上下文查找这个对象是否已经被跟踪,如果对象已经被跟踪,就直接返回被跟踪的对象,只有在本地没有找到这个对象时,EF Core 才去数据库查询,而 Single 方法则一直都是执行一次数据库查询。因此用 Find 方法有可能减少一次数据库查询,性能更好。但是如果在对象被跟踪之后,数据库中对应的数据已经被其他程序修改了,则 Find 方法可能会返回旧数据。
  • 如何在 EF Core 中高效地删除、更新数据?

    • 使用原生 SQL,但不太符合模型驱动、分层隔离等思想
    • 使用其它开源库如 Zack.EFCore.Batch

  • 全局查询筛选器
    EF Core 支持在配置实体类的时候,为实体类设置全局查询筛选器,EF Core 会自动将全局查询筛选器应用于涉及这个实体类型的所有 LINQ 查询。这个功能常见的应用场景有 "软删除" 和 "多租户"
    1. Fluent API配置全局查询筛选器:
    2. builder.HasQueryFilter(b=>b.IsDeleted==false)
    3. 忽略全局查询筛选器
    4. ct x.Books.IgnoreQueryFilters().Where(b => b.Title.Contains("o")).ToArray();
    复制代码

来源:https://www.cnblogs.com/JackyGz/archive/2023/12/28/17933078.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

举报 回复 使用道具