如何关闭实体框架跟踪

问题描述 投票:0回答:1

我已宣布我的

DbContext
为:

public abstract class LouisHoweDbContext : DbContext
{
    // lots of code
}

public class NoTrackingDbContext : LouisHoweDbContext
{
    public NoTrackingDbContext(DbContextOptions<NoTrackingDbContext> options) : base(options)
    {
    }

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        base.OnConfiguring(optionsBuilder);
        optionsBuilder.UseQueryTrackingBehavior(QueryTrackingBehavior.NoTracking);
    }
}

Program.cs
我有:

builder.Services.AddDbContextFactory<NoTrackingDbContext>(options =>
    options.UseSqlServer(config.GetConnectionString("LouisHoweDb"),
        x =>
        {
            x.UseNetTopologySuite();
            x.UseQuerySplittingBehavior(QuerySplittingBehavior.SplitQuery);
        })
);

然后我将其用作:

await using (var context = await NoTrackingDbFactory.CreateDbContextAsync())
{
    // ....
}

但是在该代码中,使用调试器,

dbContext._options.Extensions<CoreOptionsExtension>.QueryTrackingBehavior == TrackAll.

这是否意味着它正在跟踪?如果是这样,为什么?

entity-framework entity-framework-core
1个回答
1
投票

我不确定您正在检查的调试器值,但

dbContext.ChangeTracker.QueryTrackingBehavior
应该显示当前的跟踪状态。您还可以检查
dbContext.ChangeTracker.Entries().Count
,这将显示是否有任何实体有任何待处理的更改。如果您想验证集合中的任何实体是否恰好被缓存,您可以查看
.Local
。例如
if (dbContext.MyEntities.Local.Any()) throw new InvalidOperation("Local tracking is enabled.");

使用和不使用

UseQueryTrackingBehavior
检查了这一点,看起来是一致的。 (EF 核心 7)

© www.soinside.com 2019 - 2024. All rights reserved.