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 ...
随机推荐
- CaiT:Facebook提出高性能深度ViT结构 | ICCV 2021
CaiT通过LayerScale层来保证深度ViT训练的稳定性,加上将特征学习和分类信息提取隔离的class-attention层达到了很不错的性能,值得看看 来源:晓飞的算法工程笔记 公众号 论文: ...
- Memcache 与 Memcached 的区别
Memcached 从0.2.0开始,要求PHP版本>=5.2.0,Memcache 要求PHP版本>=4.3. Memcached 最后发布时间为2018-12-24,Memcache ...
- Python win11 安装lxml 失败
如果你有一个项目执行了requirements后,一直提示lxml失败,解决步骤如下 1.尝试升级pip python.exe -m pip install --upgrade pip 2.尝试下载包 ...
- [WUSTCTF2020]朴实无华(命令执行)
请求头问题 去查了一下资料了解了一下没有什莫用 robots.txt 中有东西 假flag 但是请求头里有重要消息 访问页面/fl4g.php <img src="/img.jpg&q ...
- 题解:AT_abc359_e [ABC359E] Water Tank
背景 中考结束了,但是暑假只有一天,这就是我现在能在机房里面写题解的原因-- 分析 这道题就是个单调栈. 题目上问你第一滴水流到每个位置的时间.我们考虑,答案其实就是比当前木板高且距离当前木板最近的那 ...
- 30K Star,最全面的PDF处理开源项目,你也可以拥有一个本地的PDF处理大全
大家好,我是程序猿DD 今天给大家推荐一个日常大概率能用上的开源项目:Stirling PDF 开源地址:https://github.com/Stirling-Tools/Stirling-PDF ...
- GIS前沿技术
无论是初步接触到GIS的学生,还是对GIS已经有一定的了解的从业者,肯定都非常关心两个问题:GIS有没有发展前景,GIS有哪些应用价值? 关于这两个问题,笔者的答案是GIS作为一门融合了空间数据采集. ...
- Flink 架构学习总结
Flink是一个分布式系统,要求有效地分配和管理计算资源以执行流式应用程序.它集成了所有常见的集群资源管理器,如Hadoop YARN和Kubernetes,但也可以设置为作为standalone甚至 ...
- 30FPS和120FPS在游戏中的区别
30FPS和120FPS的区别: 从动画上,时间尺度更小,渲染的时候物体单帧移动距离更小从物理引擎计算上,每一次的迭代更细致,计算更精确从渲染上:从触摸事件上,响应更及时,从触摸到屏幕,到系统捕捉,到 ...
- RDD | 算子 | 持久化
分布式集合对象上的API称之为算子 算子分为两类: transformation算子:指返回值仍然是rdd,类似于stream里的中间流 这类算子与中间流相同,是懒加载的 action算子:返回值不是 ...