【问题标题】:AddAsync() vs Add() in EF CoreEF Core 中的 AddAsync() 与 Add()
【发布时间】:2018-04-18 12:24:04
【问题描述】:

这里有多个问题:

  • 我试图了解有什么区别(除了明显的 EF Core 中 AddAsync()Add() 方法之间的异步)?

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

  • 为了一致性而选择其中一个是否重要?

【问题讨论】:

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


    【解决方案1】:

    来自source code

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

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

    【讨论】:

    • 我没有得到关于你最后一行的建议。当然,选择取决于您的身份系统,而不是 EF 与 EfCore。我总是使用 AddAsync() 。如有疑问,您可能应该使用 Add() 进行优化。
    • 我实际上误读了文档中的这一行 :) 感谢您的评论。实际上,这取决于您是否使用可能需要访问数据库的值生成器。
    • 澄清一下 - 使用在 project 中生成值但需要访问数据库的值生成器?例如,这将不包括 Identity 列,因为它们是由数据库而不是程序计算的。对吗?
    • 对,标识列是在插入时计算的,因此您可以使用 Add()。
    【解决方案2】:

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

    我想了解 EF Core 中的 AddAsync()Add() 方法之间有什么区别(除了明显的异步)?

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

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

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

    为了一致性而选择其中一个是否重要?

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

    【讨论】:

    • 如果我使用 id 生成器,我应该使用 AddAsync 吗?我的意思是,如果我的行的 PK 是由 db 生成的 int。或者如果我使用Add会不会有什么不同?
    • 如果你想在 AddAsync() 之后返回对象,这有点重要。您可以执行 Add(entity).Entity,它可能会返回生成的属性,如主键,尽管我不是 100% 确定。
    【解决方案3】:

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

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

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

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

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

    What's the Hi/Lo algorithm?

    【讨论】:

      猜你喜欢
      • 2021-12-29
      • 1970-01-01
      • 1970-01-01
      • 2018-08-24
      • 2017-11-23
      • 2016-11-04
      • 2021-12-28
      • 2020-07-14
      • 1970-01-01
      相关资源
      最近更新 更多