EF Core中的AddAsync()vs Add()

Aes*_*eir 14 entity-framework-core asp.net-core

好的多个问题在这里:

  • 我试图了解EF Core中AddAsync()和Add()方法之间的区别(在明显的异步之外)是什么?
  • 你什么时候选择一个而不是另一个?

  • 如果你选择一个而不是一致性,这有关系吗?

小智 17

在完成代码之后,我同意Henk Holterman的观点,即当代码是异步时使用Add()是一种优化.AddAsync()的文档有点误导,它说:"对于所有其他情况,应该使用非异步方法".

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

AddAsync()是100%异步安全,而Add()在某些条件下只是异步安全.与注释暗示的一样,可以配置一个列,以便Entity Framework对数据库进行查询以生成最终将插入的值.在这种情况下,如果调用Add(),则会发生阻塞.

你什么时候选择一个而不是另一个?

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

如果你选择一个而不是一致性,这有关系吗?

不,尽管AddAsync()文档中有建议.

  • 如果我使用 id 生成器,我应该使用 `AddAsync` 吗?我的意思是,如果我的行的 PK 是由数据库生成的 int 。或者如果我使用“Add”会有什么区别吗? (2认同)

juu*_*nas 9

源代码:

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

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

  • 对,在插入时计算标识列,因此您可以使用 Add()。 (2认同)

小智 9

这完全取决于你想要什么?

如果您使用 Hi/Lo 算法,则调用 AddAsync() 是有意义的。在所有其他情况下,调用sync Add()。

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

这是一个很好的描述 Hi/Li:

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

Hi/Lo 算法是什么?