实体框架不提供 DeleteAsync 或 AddAsync。为什么?

XDS*_*XDS 4 c# sql entity-framework

我只是注意到 EF(此处使用版本 5)不提供DeleteAsync()/ AddAsync()。我还注意到像这样的项目:

https://github.com/zzzprojects/EntityFramework-Plus

做事后提供DeleteAsync()。为什么 EF 不提供DeleteAsync()开箱即用的服务?只是好奇。

附录:正如 EF-Plus 的维护者所指出的,我提到的“DeleteAsync”风格与 EF 的“Delete”/“DeleteAsync”有些不同,因为前者对查询目标元素进行操作,这些元素在db/db-server,而 EF 的 Delete 操作在调用 'Delete()'之前已经检索到的元素。尽管这些方法的签名存在差异,但我的问题引起的最初关注仍然是其优点。

XDS*_*XDS 9

在观看了 MattJohnson 提供的非常有启发性的材料并使用反射探究了删除的实现之后,我推测未提供 DeleteAsync() 背后的原因是删除导致数据库在单个工作单元内发生更改 -实例生命周期。

如果有人通过 Task.Run() 提供了“DeleteAsync()”操作(也称为没有真正的异步实现),那么这将有效地通过反模式引发错觉,因为开发人员会使用此类 API,认为他们享受到了好处'true-async' 但实际上他们不会-他们只会遭受不必要的开销 ala 'await Task.Run(() => context.Foo.Delete(x))' 而不会享受任何好处。

TL;DR:对于 EF 人员不提供“DeleteAsync()”/“AddAsync()”的底线解释是“异步方法不应该说谎”(正如 MattJohnson 指出的那样)和“DeleteAsync()”鉴于撰写本文时 EF 的当前实现,/'AddAsync()' 必然会撒谎。


Jon*_*nan 6

免责声明:我是Entity Framework Plus的所有者

实体框架中的Add&&RemoveDelete我的库中的&&之间存在巨大差异。

添加/删除

Add 方法只会将实体添加到 ChangeTracker,而 Remove 方法只会将 ChangeTracker 中的 EntityState 更改为“Deleted”。

正如@Ivan 指定的Remove那样,在您调用SaveChanges或之前不会直接在数据库中保存更改SaveChangesAsync

删除

此功能从数据库中删除行,而无需在上下文中加载实体。

调用此方法可能需要相当长的时间,具体取决于将在数据库中删除的行数。

因此,DeleteAsync在这里提供一种方法是有意义的。

正如@Matt 指定的那样,该库当前使用Task.Run而不是真正异步,最终将被修复。