diff --git a/backend/src/Squidex.Data.EntityFramework/AppDbContext.cs b/backend/src/Squidex.Data.EntityFramework/AppDbContext.cs index 0d1eef5e7..1a632b599 100644 --- a/backend/src/Squidex.Data.EntityFramework/AppDbContext.cs +++ b/backend/src/Squidex.Data.EntityFramework/AppDbContext.cs @@ -29,16 +29,6 @@ public abstract class AppDbContext(DbContextOptions options, IJsonSerializer jso { public abstract SqlDialect Dialect { get; } - protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) - { - // Almost everything is read only or written by inserting new entities, so tracking would - // only cost a snapshot of every entity that is read. The few stores that update an entity - // they have queried ask for it with AsTracking. - optionsBuilder.UseQueryTrackingBehavior(QueryTrackingBehavior.NoTracking); - - base.OnConfiguring(optionsBuilder); - } - protected override void OnModelCreating(ModelBuilder builder) { var jsonColumnType = Dialect.JsonColumnType(); diff --git a/backend/src/Squidex.Data.EntityFramework/ContentDbContext.cs b/backend/src/Squidex.Data.EntityFramework/ContentDbContext.cs index 6980bca3c..85a9d9166 100644 --- a/backend/src/Squidex.Data.EntityFramework/ContentDbContext.cs +++ b/backend/src/Squidex.Data.EntityFramework/ContentDbContext.cs @@ -19,15 +19,6 @@ public abstract class ContentDbContext(DbContextOptions options, IJsonSerializer { public abstract SqlDialect Dialect { get; } - protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) - { - // Contents are never written by changing a queried entity, they are inserted in bulk, so - // tracking only costs a snapshot of every content that is read. - optionsBuilder.UseQueryTrackingBehavior(QueryTrackingBehavior.NoTracking); - - base.OnConfiguring(optionsBuilder); - } - protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.UseContent(jsonSerializer, Dialect.JsonColumnType(), options.Prefix()); diff --git a/backend/src/Squidex.Data.EntityFramework/Infrastructure/Extensions.cs b/backend/src/Squidex.Data.EntityFramework/Infrastructure/Extensions.cs index dd48c19b6..11f7d61a2 100644 --- a/backend/src/Squidex.Data.EntityFramework/Infrastructure/Extensions.cs +++ b/backend/src/Squidex.Data.EntityFramework/Infrastructure/Extensions.cs @@ -54,9 +54,15 @@ public static class Extensions return options.GetExtension().Prefix; } - public static DbContextOptionsBuilder SetDefaultWarnings(this DbContextOptionsBuilder builder) + public static DbContextOptionsBuilder SetDefaults(this DbContextOptionsBuilder builder) { builder.ConfigureWarnings(w => w.Ignore(CoreEventId.CollectionWithoutComparer)); + + // Almost everything is read only or written by inserting new entities, so tracking would + // only cost a snapshot of every entity that is read. The few stores that update an entity + // they have queried ask for it with AsTracking. This cannot be done in OnConfiguring, + // because the contexts are pooled and pooling forbids to modify the options there. + builder.UseQueryTrackingBehavior(QueryTrackingBehavior.NoTracking); return builder; } diff --git a/backend/src/Squidex.Data.EntityFramework/ServiceExtensions.cs b/backend/src/Squidex.Data.EntityFramework/ServiceExtensions.cs index 8c0ad4c61..b550a3644 100644 --- a/backend/src/Squidex.Data.EntityFramework/ServiceExtensions.cs +++ b/backend/src/Squidex.Data.EntityFramework/ServiceExtensions.cs @@ -82,7 +82,7 @@ public static class ServiceExtensions services.AddPooledDbContextFactory(builder => { - builder.SetDefaultWarnings(); + builder.SetDefaults(); builder.UseMySql(connectionString, version, options => { options.UseNetTopologySuite(); @@ -93,7 +93,7 @@ public static class ServiceExtensions services.AddNamedDbContext((builder, name) => { - builder.SetDefaultWarnings(); + builder.SetDefaults(); builder.UseBulkInsertMySql(); builder.UseMySql(connectionString, version, options => { @@ -118,7 +118,7 @@ public static class ServiceExtensions { services.AddPooledDbContextFactory(builder => { - builder.SetDefaultWarnings(); + builder.SetDefaults(); builder.UseBulkInsertPostgreSql(); builder.UseNpgsql(connectionString, options => { @@ -128,7 +128,7 @@ public static class ServiceExtensions services.AddNamedDbContext((builder, name) => { - builder.SetDefaultWarnings(); + builder.SetDefaults(); builder.UseBulkInsertPostgreSql(); builder.UseNpgsql(connectionString, options => { @@ -152,7 +152,7 @@ public static class ServiceExtensions { services.AddPooledDbContextFactory(builder => { - builder.SetDefaultWarnings(); + builder.SetDefaults(); builder.UseSqlServer(connectionString, options => { options.UseNetTopologySuite(); @@ -162,7 +162,7 @@ public static class ServiceExtensions services.AddNamedDbContext((builder, name) => { - builder.SetDefaultWarnings(); + builder.SetDefaults(); builder.UseBulkInsertSqlServer(); builder.UseSqlServer(connectionString, options => { diff --git a/backend/tests/Squidex.Data.Tests/EntityFramework/TestHelpers/MySqlFixture.cs b/backend/tests/Squidex.Data.Tests/EntityFramework/TestHelpers/MySqlFixture.cs index 12a49042a..1dd01be1c 100644 --- a/backend/tests/Squidex.Data.Tests/EntityFramework/TestHelpers/MySqlFixture.cs +++ b/backend/tests/Squidex.Data.Tests/EntityFramework/TestHelpers/MySqlFixture.cs @@ -46,6 +46,7 @@ public class MySqlFixture(string? reuseId = null) : IAsyncLifetime, ISqlContentF new ServiceCollection() .AddPooledDbContextFactory(builder => { + builder.SetDefaults(); builder.UseBulkInsertMySql(); builder.UseMySql(connectionString, ServerVersion.AutoDetect(connectionString), options => { @@ -55,6 +56,7 @@ public class MySqlFixture(string? reuseId = null) : IAsyncLifetime, ISqlContentF }) .AddNamedDbContext((builder, name) => { + builder.SetDefaults(); builder.UseBulkInsertMySql(); builder.UseMySql(connectionString, ServerVersion.AutoDetect(connectionString), options => { diff --git a/backend/tests/Squidex.Data.Tests/EntityFramework/TestHelpers/PostgresFixture.cs b/backend/tests/Squidex.Data.Tests/EntityFramework/TestHelpers/PostgresFixture.cs index de1791a25..9b007a2cb 100644 --- a/backend/tests/Squidex.Data.Tests/EntityFramework/TestHelpers/PostgresFixture.cs +++ b/backend/tests/Squidex.Data.Tests/EntityFramework/TestHelpers/PostgresFixture.cs @@ -45,6 +45,7 @@ public class PostgresFixture(string? reuseId) : IAsyncLifetime, ISqlContentFixtu new ServiceCollection() .AddPooledDbContextFactory(builder => { + builder.SetDefaults(); builder.UseBulkInsertPostgreSql(); builder.UseNpgsql(connectionString, options => { @@ -53,6 +54,7 @@ public class PostgresFixture(string? reuseId) : IAsyncLifetime, ISqlContentFixtu }) .AddNamedDbContext((builder, name) => { + builder.SetDefaults(); builder.UseBulkInsertPostgreSql(); builder.UseNpgsql(connectionString, options => { diff --git a/backend/tests/Squidex.Data.Tests/EntityFramework/TestHelpers/SqlServerFixture.cs b/backend/tests/Squidex.Data.Tests/EntityFramework/TestHelpers/SqlServerFixture.cs index 51db44a6d..332248740 100644 --- a/backend/tests/Squidex.Data.Tests/EntityFramework/TestHelpers/SqlServerFixture.cs +++ b/backend/tests/Squidex.Data.Tests/EntityFramework/TestHelpers/SqlServerFixture.cs @@ -47,6 +47,7 @@ public class SqlServerFixture(string? reuseId = null) : IAsyncLifetime, ISqlCont new ServiceCollection() .AddPooledDbContextFactory(builder => { + builder.SetDefaults(); builder.UseBulkInsertSqlServer(); builder.UseSqlServer(connectionString, options => { @@ -55,6 +56,7 @@ public class SqlServerFixture(string? reuseId = null) : IAsyncLifetime, ISqlCont }) .AddNamedDbContext((builder, name) => { + builder.SetDefaults(); builder.UseBulkInsertSqlServer(); builder.UseSqlServer(connectionString, options => {