Entity framework core QueryTrackingBehavior对DbContext没有影响

Entity framework core QueryTrackingBehavior对DbContext没有影响,entity-framework-core,entity-framework-core-3.0,Entity Framework Core,Entity Framework Core 3.0,也许我的期望需要重新设定 我在为“非跟踪”环境做概念验证。 在上下文的构造函数中,我添加了以下行: ChangeTracker.QueryTrackingBehavior=QueryTrackingBehavior.NoTracking ChangeTracker.Tracked+=ChangeTracker\u Tracked 和以下处理程序: private void ChangeTracker_Tracked(object sender, Microsoft.EntityFramework

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

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

ChangeTracker.QueryTrackingBehavior=QueryTrackingBehavior.NoTracking
ChangeTracker.Tracked+=ChangeTracker\u Tracked

和以下处理程序:

private void ChangeTracker_Tracked(object sender, Microsoft.EntityFrameworkCore.ChangeTracking.EntityTrackedEventArgs e)
{
    Debug.WriteLine("Tracking has commenced");
}
我的期望是,如果我向上下文中添加了一个实体,那么由于NoTracking跟踪行为配置,
Tracked
处理程序将不会启动。但当我添加一个实体时,确实会触发事件

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

好的,我通过一点实验发现了这一点。我将把这个答案留在这里,供研究者们参考

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

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

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

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

如果您发现自己在这样的上下文中添加了一个实体,那么您可能想问问自己为什么需要这样做

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