EF Core – 冷知识
Add vs AddAsync
参考:
AddAsync() vs Add() in EF Core
EF Core’s AddAsync v. Add Method
EF Core in ASP.NET Core - CRUD
无意间再看视频的时候, 看见有人使用 AddAsync. 在我的认知 Add 只是修改了 local 的 entity, SaveChangesAsync 才会链接数据库.
所以按道理, Add 不需要 Async 丫. 虽然说 "有 Async 就尽量用 Async“ 是没错, 但是不直观丫.
于是搜了一下. 结论是 AddAsync 是用于那些需要 auto generate id 之类的情况的. 很冷门的情况啦.
所以绝大部分情况下是不需要的, 那用 Async 会伤性能吗, 有 ValueTask 所以是不会的. 但即便如此,为了更好的了解, 我建议是用 Add 就好了.
ValueGenerated
参考: Generated Values
Value Generated 讲的就是那种 default value 或者 SQL trigger 维护的值.
一共有 5 个方法

ValueGeneratedNever 是用来覆盖 EF Core 默认行为的, 比如 primary key 默认就是 auto generate 的, 这个很少会用到
ValueGeneratedOnUpdateSometimes, 这个我没有看懂什么意思, sometimes? 没有找到相关资料.
ValueGeneratedOnAdd 这个就是说在 insert 的时候 SQL 会负责 generate value, 但是如果我们在 entity 有 set value 的话, 它会用我们的 value 哦, 不清楚是不是 bug (v6.0 测试是这样)... 但是 by right 我们不应该给 value 啦
ValueGeneratedOnUpdate 就是说在 update 的时候 SQL 会负责 generate value, 所以 EF 会无视 entity 的 value, 你改了也没用. 它不会反应到 SQL 语句里的.
ValueGeneratedOnAddOrUpdate 就是 Add + Update, 一起, 奇怪应该叫 And 而不是 Or 吧... set 了这个之后 insert 的时候即使 Entity 有 value 也没用了, 它会无视.
当设置了 ValueGenerated 以后, 在 insert/update 后, EF 会去跑 select 把新的值拿来 update entity, 但是它不支持跨 Entity 啦, 比如你 update Entity A, 但是 SQL trigger update B Table, 然后 Entity B 是不会被更新的.
When unique + nullable EF will auto add filter
当 unique + nullable 时, EF 会自动帮我们添加 filter... 如果不希望它自作聪明的话, 可以把它关掉.
but 如果是 clustered EF 就不会加 filter 了哦.

Double apply duplicated where
假如我写了一模一样的 where 语句. EF 是否会过滤掉呢?
var query1 = _db.Products.Where(e => e.Status == ProductStatus.Other);
var query2 = query1.Where(e => e.Status == ProductStatus.Other);
当然是不会啦

拿 SQL Server 会不会过滤呢? 很可能是会的, 毕竟 SQL 有词法优化步骤, 比如 where 的顺序对 SQL 来说并不重要
Does the order of where clauses matter in SQL?
为什么我会研究这个呢? 因为我在做权限过滤, 需要对 OData query 做过滤. 我想先过滤 odata query 然后再过滤权限. 因为这样会比较快 (我的业务啦). 于是在 Controller 里跑了 ODataQueryOptions.Apply
但结果发现, 在 EnableQuery.OnActionExecuted 时它依然会 apply 多一次, 就造成了上面的结果. 但最后发现原来顺序不重要, 那就可以先过滤权限, 再交由 EnableQuery.OnActionExecuted 执行 Apply 了. 瞎操心一场.
How function be translated in query?
有个 String 和 DateTime
public class Product
{
public int Id { get; set; }
public string Name { get; set; } = "";
public DateTime Date { get; set; }
}
Where query 的时候调用 function
public static string GetMyValue() => "test"; var products = db.Products.Where(e => e.Name == GetMyValue() && e.Date == DateTime.Now.AddDays(1)).ToList();
翻译结果
WHERE ([p].[Name] = N'test') AND ([p].[Date] = DATEADD(day, CAST(1.0E0 AS int), GETDATE()))
EF Core 在解析表达式时先调用 GetMyValue 获取到了 test, 而 DateTime.Now.AddDays 则直接翻译成了 SQL 语句.
EF Core – 冷知识的更多相关文章
- EF Core 基础知识
数据库连接字符串 在 ASP.NET Core 添加配置片段: { "ConnectionStrings": { "BloggingDatabase": &qu ...
- 基于EF Core的Code First模式的DotNetCore快速开发框架
前言 最近接了几个小单子,因为是小单子,项目规模都比较小,业务相对来说,也比较简单.所以在选择架构的时候,考虑到效率方面的因素,就采取了asp.net+entity framework中的code f ...
- [翻译 EF Core in Action 2.3] 理解EF Core数据库查询
Entity Framework Core in Action Entityframework Core in action是 Jon P smith 所著的关于Entityframework Cor ...
- [翻译 EF Core in Action 2.2] 创建应用程序的数据库上下文
Entity Framework Core in Action Entityframework Core in action是 Jon P smith 所著的关于Entityframework Cor ...
- EF Core in Action 中文翻译 第一部分导航
Entityframework Core in action Entityframework Core in action是 Jon P smith 所著的关于Entityframework Core ...
- [翻译 EF Core in Action 2.1] 设置一个图书销售网站的场景
Entity Framework Core in Action Entityframework Core in action是 Jon P smith 所著的关于Entityframework Cor ...
- [翻译 EF Core in Action 2.0] 查询数据库
Entity Framework Core in Action Entityframework Core in action是 Jon P smith 所著的关于Entityframework Cor ...
- [翻译 EF Core in Action 1.10] 应该在项目中使用EF Core吗?
Entity Framework Core in Action Entityframework Core in action是 Jon P smith 所著的关于Entityframework Cor ...
- [翻译 EF Core in Action 1.11] 何时不应该使用EF Core
Entity Framework Core in Action Entityframework Core in action是 Jon P smith 所著的关于Entityframework Cor ...
- [翻译 EF Core in Action 1.9] 掀开EF Core的引擎盖看看EF Core内部是如何工作的
Entity Framework Core in Action Entityframework Core in action是 Jon P smith 所著的关于Entityframework Cor ...
随机推荐
- Swift开发基础04-枚举
基本用法 enum Direction { case north case south case east case west } enum Direction { case north, south ...
- css3实现背景三角形样式
话不多说上效果图: css: font-family: PingFang-SC-Heavy, PingFang-SC; font-weight: 800; color: #2160AD; border ...
- P1081 [NOIP2012 提高组] 开车旅行
思路: 首先令 \(nxt1_i\) 表示右侧最近的城市距离(\(id1_i\) 为编号),令 \(nxt2_i\) 表示右侧第二近的城市编号(\(id2_i\) 为编号):可以使用 set 找出离这 ...
- 【H5】09 音频和视频
现在我们可以轻松的为一张 web 网页添加简单的图像,下一步是开始为 HTML 文档添加音频和视频的播放器. 在这篇文章当中,我们会学习到 <video> 和 <audio> ...
- Ubuntu的性能模式与省电模式:进行科学计算时一定要手动将Ubuntu的CPU模式设置为性能模式
不论是什么系统,windows11还是Ubuntu.Centos.RedHat,其运行时都有一个运行模式的概念,其实这个运行模式就是CPU的性能模式,一般可以分为性能模式和省电模式两种,当然也有介于两 ...
- If Messi doesn't understand how to respect others, then he also doesn't deserve to receive respect from others.
If Messi doesn't understand how to respect others, if he doesn't understand the spirit of honoring c ...
- baselines算法库common/tile_images.py模块分析
该模块只有一个函数,全部内容: import numpy as np def tile_images(img_nhwc): """ Tile N images into ...
- Java反射初探123456789
牛逼的框架都反射,不要问我为什么,因为我也不知道 可能是因为生成了class文件没法实例化,所以只能反射创建对象,但是在spring中,ioc就是反射实现的控制反转 看Spring4.x企业级开发实战 ...
- Redis分布式锁防止缓存击穿
一.Nuget引入 StackExchange.Redis.DistributedLock.Redis依赖 二.使用 StackExchange.Redis 对redis操作做简单封装 public ...
- 使用Kiota工具生成WebApi的代理类,以及接口调用的简单体验
前言 当前.NET环境下,生成WebApi代理类的工具已经有很多选择了,比如OpenApi Generator,NSwag和Refitter等,不同的工具生成的代码风格以及实现方式略有不同,比如Ref ...