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);
});