首页 > 其他分享 >试试这 6 个小技巧,提升 EF Core 性能

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

时间:2023-12-28 17:01:17浏览次数:23  
标签:Core 试试 EF ctx 查询 Book b1

iamge

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();

标签:Core,试试,EF,ctx,查询,Book,b1
From: https://www.cnblogs.com/JackyGz/p/17933078.html

相关文章

  • codeforces刷题(1100):1901B_div2
    B、ChipandRibbon跳转原题点击此:该题地址1、题目大意  存在一条由n个单元格组成的带子。chip可以做两个操作:1、由\(i\)走到\(i+1\),但是不能走到\(i-1\);2、可以传送到任意位置,包括传送到原地。每到一个单元格,该单元格的数值+1(初始为0)。最开始chip在从第一格开始走起(题......
  • codeforces刷题(1100):1902B_div2
    B、GettingPoints跳转原题点击此:该题地址1、题目大意  Monocarp为了完成总共n天的某学期的p学分任务。Monocarp每天可以选择两种度过方式:上一次课和完成最多两个任务或者休息一天。其中上课获得l学分,每个任务获得t学分,其中任务不可以重复接取,并且每周获得一个新的任务(第一......
  • .NET Core发送HTTP Post和Get
    ///<summary>///公共方法——发送httppost请求2020年6月2日11:20:42Dennyhui///</summary>///<paramname="formData">参数</param>///<paramname="requestUri">请求地址</param>......
  • NetCore高级系列文章04---async、await原理揭秘
    async、await本质上是C#提供的语法糖,编译器编译后是状态机的调用。先看如下的一段代码,要main方法中调用了三个await方法 将此dll进行反编译为4.0的代码如下: 可见到两个Main方法,也就是说我们在程序中Main方法上加了async关键词,编译器会编译成一个是异步的一个是非异步方法,程......
  • ASP.NET Core 内置异常中间件的三种方法
    方法一app.UseExceptionHandler(configure=>{configure.Run(asynccontext=>{varexcHandler=context.Features.Get<IExceptionHandlerPathFeature>();varex=excHandler.Error;if(ex!=null){conte......
  • 享元设计模式 和 享元设计模式在 FastDateFormat类中的应用
    1.概述享元设计模式(FlyweightPattern):通过尽量共享实例来避免new出实例。享元设计模式中有两个角色,一是要共享的实例,二是获取或创建这些共享实例的工厂。举一个例子:例如String常量池,大家创建的String常量,创建String的时候,先去常量池中看一下,有该String常量直接使用该常量,如果没......
  • edgecore.yaml
    CRD-config devices_v1alpha2_device.yaml---apiVersion:apiextensions.k8s.io/v1kind:CustomResourceDefinitionmetadata:annotations:controller-gen.kubebuilder.io/version:v0.6.2creationTimestamp:nullname:devices.devices.kubeedge.iospe......
  • 【Kafka-Eagle】EFAK告警配置与实践
    Kafka-Eagle是一个开源的Kafka集群监控与告警系统,可以帮助用户实现对Kafka集群的实时监控、性能指标收集以及异常告警等功能。下面是关于Kafka-Eagle的告警配置和实践的一般步骤:安装和配置Kafka-Eagle:下载最新版本的Kafka-Eagle安装包,并解压到一个合适的目录中。进入Kafka-Eagle的......
  • 归一化方法-Z-score
    归一化方法-Z-scoreZ-score定义z-score精确测量偏离数据点均值的标准差数。公式如下:\(z=\frac{data\point-mean}{standard\deviation}\),标准数学公式为:\(z=\frac{x-\mu}{\sigma}\)几个z-score相关的重要性质:z-score如果是正值,说明数据点高于均值;z-score如果是......
  • 「题解」Codeforces 1427G One Billion Shades of Grey
    感谢127的指导/ll\(|h_u-h_v|=\max(0,h_u-h_v)+\max(0,h_v-h_u)\),那么可以把它看成这样的问题:\[\min\{\sum_{(u,v)}\max(0,h_u-h_v+w_{u,v})c_{u,v}\}\]对偶一下,问题就变为:如果两个格子相邻就互相连容量为\(c_{u,v}=1\),费用为\(w_{u,v}=0\)的边,跑最大费用循环流。为了限......