EF Core中的AddAsync()vs Add()

时间:2017-11-06 10:54:07

标签: asp.net-core entity-framework-core

这里有多个问题:

  • 我试图了解有什么不同(在显而易见的范围之外) EF Core中的AddAsync()和Add()方法之间的异步?
  • 你什么时候选择其中一个?

  • 如果您选择其中一个以保持一致性是否重要?

3 个答案:

答案 0 :(得分:8)

来自source code

  

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

因此,如果您使用可能需要访问数据库的值生成器来获取新值以分配给新条目(例如SequenceHiLo生成器),则使用AddAsync()

答案 1 :(得分:8)

阅读完代码后,我同意Henk Holterman的评论,即在代码异步时使用Add()是一种优化。当说“对于所有其他情况,应使用非异步方法”时,AddAsync()的文档有点误导。

  

我试图了解EF Core中AddAsync()和Add()方法之间的区别(在明显的异步之外)吗?

AddAsync()是100%异步安全的,而Add()仅在某些情况下是异步安全的。就像注释所暗示的那样,可以配置您的一列,以使Entity Framework对数据库进行查询以生成最终将被插入的值。在这种情况下,如果您调用Add(),则会发生阻塞。

  

您何时选择一个?

  • 如果您不编写异步代码,则一定要使用Add()。
  • 如果您要编写异步代码并希望保持简单,请像其他方法一样选择AddAsync()。
  • 如果您真的想避免异步调用的开销,并且知道Add()永远不会进行数据库查询,请使用Add()。
  

是否为了一致性而选择一个,这有关系吗?

否,尽管AddAsync()文档中有建议。

答案 2 :(得分:0)

这一切都取决于您想要什么?

如果使用的是Hi / Lo算法,则可以使用

AddAsync()进行调用。在其他所有情况下,请调用sync Add()。

重要的是要了解这不是某种EF功能,这是一种处理数据库的旧技术。选择此技术会对您的数据设计产生深远的影响。因此,更多的是您处理数据的方法,而不是同步/异步代码。

这是一个很好的说明:嗨/李:

https://www.talkingdotnet.com/use-hilo-to-generate-keys-with-entity-framework-core/

What's the Hi/Lo algorithm?