【问题标题】:QueryTrackingBehavior has no Effect on DbContextQueryTrackingBehavior 对 DbContext 没有影响
【发布时间】:2020-11-10 09:36:45
【问题描述】:

也许我的期望需要重新设定。

我正在为“非跟踪”上下文进行概念验证。 在上下文的构造函数中,我添加了以下几行:

ChangeTracker.QueryTrackingBehavior = QueryTrackingBehavior.NoTracking;
ChangeTracker.Tracked += ChangeTracker_Tracked;

以及以下处理程序:

private void ChangeTracker_Tracked(object sender, Microsoft.EntityFrameworkCore.ChangeTracking.EntityTrackedEventArgs e)
{
    Debug.WriteLine("Tracking has commenced");
}

我的期望是,如果我在上下文中添加一个实体,Tracked 处理程序不会因为 NoTracking 跟踪行为配置而触发。但是当我添加一个实体时,果然,事件触发了!

var pub = new Publishers
{
    Name = "Blabla"
};
var ctx = serviceProvider.GetService<LibraryNoTrackingContext>();
ctx.Publishers.Add(pub);

根据我的观察,QueryTrackingBehavior 配置似乎不起作用,因为正在进行更改跟踪。

我是不是搞错了?如果是这样,No Change Tracking 是如何工作的?

注意:我也尝试了以下代码:

serviceCollection.AddDbContext<LibraryNoTrackingContext>(
        o =>
        {
            o.UseSqlServer(configuration.GetConnectionString("Default"));
            o.UseQueryTrackingBehavior(QueryTrackingBehavior.NoTracking);
        });

【问题讨论】:

    标签: entity-framework-core entity-framework-core-3.0


    【解决方案1】:

    好的,我通过一些实验发现了这一点。我将把这个答案留在这里,以供调查此问题的人使用。

    QueryTrackingBehavior.NoTracking 的 QueryTrackingBehavior 正在做它应该做的事情。
    我的理解是问题所在。

    如果您使用“无跟踪”上下文检索数据,这些实体将不会添加到 ChangeTracker

    但是,如果您将实体添加到上下文中,即使它是“无跟踪”上下文,也会跟踪这些实体,即它们将被添加到 ChangeTracker

    因此,如果您想将“无跟踪”上下文用于仅检索数据的请求,那么它仍然是有价值的。不会跟踪检索到的每个实体。

    如果您发现自己将实体添加到这样的上下文中,您可能想问自己为什么需要这样做。

    【讨论】:

    • 感谢您 - 我正在寻找确认构造函数中的 QueryTrackingBehavior.NoTracking 得到遵守。就个人而言,我默认使用该选项来加快查询速度,并在修改/插入/删除数据时显式调用适当的方法。我 95% 的查询都是阅读 - 所以就你的最后一句话而言,我一直都这样做!
    猜你喜欢
    • 2015-11-04
    • 2010-12-01
    • 2013-10-07
    • 2021-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-24
    相关资源
    最近更新 更多