c# - Entity Framework 不提供 DeleteAsync 或 AddAsync。为什么?

标签 c# sql entity-framework

我刚刚注意到 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/

相关文章:

c# - WPF Datagrid 新行验证

c# - 选择 KeyValuePair 列表的值

MYSQL 从当前年份、当前月份和星期几中获取日期

c# - Entity Framework - 同一实体的不同代理对象。并包括具有多条路径到同一目的地的行为

c# - 将窗口附加到外部进程

mysql - 如何从日期时间列中获取两小时之间的行?

sql - 如何在oracle中分散两个区间的平均值

c# - 在双向关系和 Entity Framework 中保持完整性

c# - 在以下情况下正确使用抽象类或接口(interface)

c# - 调用动态方法时"Operation could destabilize the runtime"