EF Core 性能很差?试试这 6 个小技巧

简介: EF Core 性能很差?试试这 6 个小技巧

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

  1. AsNoTracking
    在项目开发的时候,如果查询出来的对象不会被修改、删除等,那么在查询的时候,可以启用AsNoTracking,这样就能降低EF Core的资源占用
Book[] books = ctx.Books.AsNoTracking().Take(3).ToArray();
Book b1 = books[0];
b1.Title = "abc";
EntityEntry entry1 = ctx.Entry(b1);
Console.WriteLine(entry1.State);

2.通过一条SQL语句高效更新实体类

Book b1 = new Book {Id=10};
b1.Title = "yzk";
var entry1 = ctx.Entry(b1);   //直接创建实体对象
entry1.Property("Title").IsModified = true;   //标记 Title 字段被修改
Console.WriteLine(entry1.DebugView.LongView);
ctx.SaveChanges();  //只生成这个字段的更新的SQL语句

3.用一条SQL语句高效删除数据

Book b1 = new Book { Id = 28 };
ctx.Entry(b1).State = EntityState.Deleted;
ctx.SaveChanges();

4.关于 Find 和 FindAsync 方法
Find 或者 FindAsync 方法(以下简称为Find)会先在上下文查找这个对象是否已经被跟踪,如果对象已经被跟踪,就直接返回被跟踪的对象,只有在本地没有找到这个对象时,EF Core 才去数据库查询,而 Single 方法则一直都是执行一次数据库查询。因此用 Find 方法有可能减少一次数据库查询,性能更好。但是如果在对象被跟踪之后,数据库中对应的数据已经被其他程序修改了,则 Find 方法可能会返回旧数据。

5.如何在 EF Core 中高效地删除、更新数据?

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

6.全局查询筛选器
EF Core 支持在配置实体类的时候,为实体类设置全局查询筛选器,EF Core 会自动将全局查询筛选器应用于涉及这个实体类型的所有 LINQ 查询。这个功能常见的应用场景有 “软删除” 和 “多租户”

Fluent API配置全局查询筛选器:
builder.HasQueryFilter(b=>b.IsDeleted==false)
忽略全局查询筛选器
ct x.Books.IgnoreQueryFilters().Where(b => b.Title.Contains("o")).ToArray();


相关文章
|
3月前
|
监控 安全 数据库
逆天改命!用自定义上下文管理器,让你的Python代码效率飙升
【7月更文挑战第7天】Python上下文管理器简化资源管理,通过自定义实现优雅控制。使用with语句自动执行资源获取和释放,确保异常安全。例如,FileContextManager类通过__enter__打开文件,__exit__关闭并处理异常。自定义上下文管理器可封装重复逻辑,增强功能如日志和监控,提升代码效率与质量。利用这一工具,代码更简洁、高效且易于维护。**
30 1
|
3月前
|
运维 中间件 数据库
浅析JAVA日志中的性能实践与原理解释问题之元信息打印会导致性能急剧下降问题如何解决
浅析JAVA日志中的性能实践与原理解释问题之元信息打印会导致性能急剧下降问题如何解决
|
5月前
|
并行计算 算法 编译器
如何解决Python性能慢的问题?
如何解决Python性能慢的问题?
81 0
|
11月前
|
存储 缓存 Java
这代码居然有差别?CPU友好的代码该这样写(3)
这代码居然有差别?CPU友好的代码该这样写
46 0
这代码居然有差别?CPU友好的代码该这样写(3)
|
11月前
|
存储 缓存 Java
这代码居然有差别?CPU友好的代码该这样写(1)
这代码居然有差别?CPU友好的代码该这样写
74 0
这代码居然有差别?CPU友好的代码该这样写(1)
|
11月前
|
存储 缓存 Java
这代码居然有差别?CPU友好的代码该这样写(4)
这代码居然有差别?CPU友好的代码该这样写
47 0
这代码居然有差别?CPU友好的代码该这样写(4)
|
11月前
|
缓存
这代码居然有差别?CPU友好的代码该这样写(2)
这代码居然有差别?CPU友好的代码该这样写
46 0
这代码居然有差别?CPU友好的代码该这样写(2)
|
缓存 固态存储 Ubuntu
十七、Linux性能优化实战学习笔记-如何利用系统缓存优化程序的运行效率?
Buffer 和Cache 的设计目的,是为了提升系统的 I/O 性能。它们利用内存,充当起慢速磁盘与快速CPU 之间的桥梁,可以加速 I/O 的访问速度。
270 0
|
存储 缓存 Java
这代码居然有差别?CPU友好的代码该这样写
CPU友好的代码与我们平时的那些CRUD操作可能没啥关系。但是用心组织的代码其实也能让性能提升百倍。我们不应该停留在CRUD的漩涡中。
3404 1
这代码居然有差别?CPU友好的代码该这样写
PHP如果开启的扩展越多,对性能有什么影响?底层原理是什么?
PHP如果开启的扩展越多,对性能有什么影响?底层原理是什么?
157 0