【问题标题】:Disable AutoDetectChanges on Entity Framework Core在 Entity Framework Core 上禁用 AutoDetectChanges
【发布时间】:2020-04-27 07:26:57
【问题描述】:

有人知道如何禁用 EFCore 上的 AutoDetectChanges 吗?

我需要这样做,因为我必须在我的数据库中进行大量导入,并且无法在网络上找到信息。

试过了,还是不行:

_context.Configuration.AutoDetectChangesEnabled = false;

说配置不存在。

非常感谢。

【问题讨论】:

  • ORM NOT 用于大量导入。此外,您确实希望在导入时跟踪更改 - 否则 ORM 将不知道要插入什么
  • PS 你已经问过了。答案还是一样的。不要使用 ORM。您没有要映射到关系表的对象,您只有行。使用 ORM 插入 500K 行将导致性能下降大约 500-500K 倍,具体取决于 ORM 是否可以批量插入。
  • 即使使用 EF Core 2.x 的 INSERT 批处理,每个批处理也不能包含超过 1K 的行,最多只能产生 500 个单独的 INSERT。 所有这些行都将被完全记录,从而导致大量 IO 并为每个 2GB 文件添加至少 2GB 的事务日志。另一方面,SqlBulkCopy 将使用最少的日志记录在单个流中发送所有行

标签: c# sql asp.net-core entity-framework-core record


【解决方案1】:

这是我熟悉的,来自文档:

var blogs = context.Blogs
    .AsNoTracking()
    .ToList();

参考:https://docs.microsoft.com/en-us/ef/core/querying/tracking

【讨论】:

  • 非常感谢!如果我用这个? _context.ChangeTracker.QueryTrackingBehavior = QueryTrackingBehavior.NoTracking;
  • OP 想要insert 数据。禁用更改跟踪将防止这种情况发生
  • 这两个步骤是相连的。如果您在没有跟踪的情况下查询数据,那么这些实体的插入/更新行为将受到影响。这样做的缺点是 EF 会尝试插入已经存在的记录,或者更新不存在的记录并出现错误。我认为 OP 的策略可以解释这一点。
  • 关闭跟踪与关闭自动更改检测不同。后者通常用于推迟对跟踪实体的更改检测以赢得性能。 IE。稍后将在代码中显式执行更改检测。
【解决方案2】:

我认为我之前的做法是,当您注册 DBContext 时,您可以将其关闭,这样您就不必将其添加到每个查询中。

在我的脑海中,没有代码前。立即参考,以免我错了

services.AddDbContext<YourDbContext>(options =>
{
    options.UseQueryTrackingBehavior(QueryTrackingBehavior.NoTracking);
});

编辑:找到了。 https://docs.microsoft.com/en-us/dotnet/api/microsoft.entityframeworkcore.dbcontextoptionsbuilder.usequerytrackingbehavior?view=efcore-3.1

很确定这就是你要找的东西

【讨论】:

  • 关闭跟踪与关闭自动更改检测不同。后者通常用于推迟对跟踪实体的更改检测以赢得性能。 IE。稍后将在代码中显式执行更改检测。
【解决方案3】:

你尝试了什么

_context.Configuration.AutoDetectChangesEnabled = false;

适用于 EF6。

对应的EF Core选项AutoDetectChangesEnabled是与DbContext关联的ChangeTracker的属性,所以对应的代码是

_context.ChangeTracker.AutoDetectChangesEnabled = false;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-14
    • 1970-01-01
    • 2017-08-05
    • 2017-02-17
    • 2016-11-08
    • 1970-01-01
    相关资源
    最近更新 更多