我刚刚注意到 EF(此处使用版本 5)不提供 DeleteAsync()
/AddAsync()
。我还注意到像这样的项目:
https://github.com/zzzprojects/EntityFramework-Plus
请事后提供 DeleteAsync()
。为什么 EF 不提供开箱即用的 DeleteAsync()
?只是好奇。
附录:正如 EF-Plus 的维护者所指出的,我提到的“DeleteAsync”风格与 EF 的“Delete”/“DeleteAsync”有些不同,因为前者在查询目标元素上运行 将在数据库/数据库服务器上进行匹配,而 EF 的 Delete 对在调用“Delete()”之前已经检索到的元素进行操作。尽管这些方法的签名存在差异,但我的问题最初引起的关注仍然是有道理的。
最佳答案
在观看了 MattJohnson 提供的非常有启发性的 Material 并使用反射探究了 Delete 的实现之后,我推测未提供 DeleteAsync() 背后的原因是删除导致数据库在单个单元内发生更改-工作实例生命周期。
如果有人通过 Task.Run() 提供了“DeleteAsync()”操作(又名没有真正的异步实现),这实际上会通过反-从某种意义上说,开发人员会使用这种 API 并认为他们享受“真正异步”的好处,但实际上他们不会 - 他们只会遭受不必要的“等待任务”开销。 Run(() => context.Foo.Delete(x))' 没有享受任何好处。
TL;DR:关于为什么 EF 的人们不提供“DeleteAsync()”/“AddAsync()”的底线解释是“异步方法不应该说谎”(正如 MattJohnson 指出的那样)和“DeleteAsync”考虑到撰写本文时 EF 的当前实现,()'/'AddAsync()' 肯定会说谎。
关于c# - Entity Framework 不提供 DeleteAsync 或 AddAsync。为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42422656/