我正在编写一个 Blazor(服务器端)应用程序,并得出结论,我希望为 CrUD 操作启用更改跟踪,并为 cRud 操作关闭更改跟踪。
我是否应该创建两个 DbContext 类,一个返回一个启用更改跟踪的 DbContext,另一个关闭它?这将指向同一个数据库。
或者拥有一个启用了更改跟踪的 DbContext 类是否更好。然后当我需要数据来显示它时,我使用 context.Books.AsNoTracking()... 为该查询关闭它。
为什么
我认为更改跟踪对 CrUD 操作有意义有两个原因。首先,因为这将避免由于我忘记在需要的地方调用
Add()
而导致的错误。其次,因为 Update()
重写所有内容而更改跟踪只写更改的内容。
我认为没有跟踪对于 cRud 操作是有意义的,因为它消除了在没有任何变化时跟踪变化的开销。这是安全的,因为我只会对本质上是只读信息视图的网页执行此操作。
因此,在为 cRud 案例获得性能的同时,保持它的安全和简单。
两个 DbContext
我还没有尝试过,但我假设我可以进行以下调用,然后以某种方式选择我想要的上下文。我不知道这是否可能,这是我在这里要问的一部分。
builder.Services.AddDbContextFactory<LouisHoweDbContext>( options =>
options.UseSqlServer( builder
.Configuration
.GetConnectionString("LouisHoweDb")
)
.EnableSensitiveDataLogging()
);
builder.Services.AddDbContextFactory<LouisHoweDbContext>( options =>
options.UseSqlServer( builder
.Configuration
.GetConnectionString("LouisHoweDb")
)
.UseQueryTrackingBehavior(QueryTrackingBehavior.NoTracking)
.EnableSensitiveDataLogging()
);