我刚注意到EF(此处使用版本5)未提供DeleteAsync()
/ AddAsync()
。我也注意到像这样的项目:
https://github.com/zzzprojects/EntityFramework-Plus
确实提供DeleteAsync()
作为事后的想法。为什么EF不提供开箱即用的DeleteAsync()
?好奇。
附录:正如EF-Plus的维护者所指出的,我提到的'DeleteAsync'风格与EF的'删除'/'DeleteAsync'有些不同,前者在查询目标元素将匹配db / db-server,而EF的Delete对之前已检索到的元素进行操作调用Delete()'。尽管这些方法的签名存在差异,但我的问题所提出的原始问题仍然存在其优点。
答案 0 :(得分:2)
免责声明:我是Entity Framework Plus
的所有者 Add
&&来自实体框架的Remove
和来自我的图书馆的Delete
。
添加/删除
Add方法只会将实体添加到ChangeTracker,而Remove方法只会将EntityState更改为" Deleted"在ChangeTracker中。
正如@Ivan指定的那样,Remove
不会直接在数据库中保存更改,直到您致电SaveChanges
或SaveChangesAsync
删除强>
此功能从数据库中删除行而不在上下文中加载实体。
调用此方法可能需要相当长的时间,具体取决于将在数据库中删除的行数。
因此,提供DeleteAsync
方法在这里有意义。
正如@Matt指定的那样,库当前使用Task.Run
而不是真正的异步,最终将被修复。
答案 1 :(得分:1)
我认为所有答案的要点在于,Remove()
方法不是耗时的操作,而它仅更改了跟踪器中的简单状态,而其他方法例如Find()
需要对数据库执行ping操作,这将是一个耗时的过程。
另一方面,诸如AddAsync()
之类的方法的注释如下:
此方法是异步的,仅允许使用特殊值生成器,例如 由“ Microsoft.EntityFrameworkCore.Metadata.SqlServerValueGenerationStrategy.SequenceHiLo”使用, 异步访问数据库。对于所有其他情况,非异步方法 应该使用。