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

时间:2017-02-23 17:39:44

标签: c# sql entity-framework

我刚注意到EF(此处使用版本5)未提供DeleteAsync() / AddAsync()。我也注意到像这样的项目:

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

确实提供DeleteAsync()作为事后的想法。为什么EF不提供开箱即用的DeleteAsync()?好奇。

附录:正如EF-Plus的维护者所指出的,我提到的'DeleteAsync'风格与EF的'删除'/'DeleteAsync'有些不同,前者在查询目标元素将匹配db / db-server,而EF的Delete对之前已检索到的元素进行操作调用Delete()'。尽管这些方法的签名存在差异,但我的问题所提出的原始问题仍然存在其优点。

2 个答案:

答案 0 :(得分:2)

免责声明:我是Entity Framework Plus

的所有者

Add&&来自实体框架的Remove和来自我的图书馆的Delete

添加/删除

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

正如@Ivan指定的那样,Remove不会直接在数据库中保存更改,直到您致电SaveChangesSaveChangesAsync

删除

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

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

因此,提供DeleteAsync方法在这里有意义。

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

答案 1 :(得分:1)

我认为所有答案的要点在于,Remove()方法不是耗时的操作,而它仅更改了跟踪器中的简单状态,而其他方法例如Find()需要对数据库执行ping操作,这将是一个耗时的过程。
另一方面,诸如AddAsync()之类的方法的注释如下:

此方法是异步的,仅允许使用特殊值生成器,例如 由“ Microsoft.EntityFrameworkCore.Metadata.SqlServerValueGenerationStrategy.SequenceHiLo”使用, 异步访问数据库。对于所有其他情况,非异步方法 应该使用。