diff --git a/src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Api/Data/AppDbContext.cs b/src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Api/Data/AppDbContext.cs index 6f11dab968..aa746d94f2 100644 --- a/src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Api/Data/AppDbContext.cs +++ b/src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Api/Data/AppDbContext.cs @@ -13,6 +13,9 @@ //#if (notification == true) using Boilerplate.Server.Api.Models.PushNotification; //#endif +//#if (database == "Sqlite") +using System.Security.Cryptography; +//#endif namespace Boilerplate.Server.Api.Data; @@ -54,18 +57,14 @@ protected override void OnModelCreating(ModelBuilder modelBuilder) ConfigureIdentityTableNames(modelBuilder); - //#if (database != "Sqlite") ConfigureConcurrencyStamp(modelBuilder); - //#endif } public override int SaveChanges(bool acceptAllChangesOnSuccess) { try { - //#if (database != "Sqlite") - ReplaceOriginalConcurrencyStamp(); - //#endif + SetConcurrencyStamp(); return base.SaveChanges(acceptAllChangesOnSuccess); } @@ -79,9 +78,7 @@ public override int SaveChanges(bool acceptAllChangesOnSuccess) { try { - //#if (database != "Sqlite") - ReplaceOriginalConcurrencyStamp(); - //#endif + SetConcurrencyStamp(); return await base.SaveChangesAsync(acceptAllChangesOnSuccess, cancellationToken); } @@ -91,16 +88,8 @@ public override int SaveChanges(bool acceptAllChangesOnSuccess) } } - //#if (database != "Sqlite") - /// - /// https://github.com/dotnet/efcore/issues/35443 - /// - private void ReplaceOriginalConcurrencyStamp() + private void SetConcurrencyStamp() { - //#if (IsInsideProjectTemplate == true) - if (Database.ProviderName!.EndsWith("Sqlite", StringComparison.InvariantCulture)) - return; - //#endif ChangeTracker.DetectChanges(); foreach (var entityEntry in ChangeTracker.Entries().Where(e => e.State is EntityState.Modified or EntityState.Deleted)) @@ -109,10 +98,28 @@ private void ReplaceOriginalConcurrencyStamp() || currentConcurrencyStamp is not byte[]) continue; - entityEntry.OriginalValues.SetValues(new Dictionary { { "ConcurrencyStamp", currentConcurrencyStamp } }); + //#if (database != "Sqlite") + //#if (IsInsideProjectTemplate == true) + if (Database.ProviderName!.EndsWith("Sqlite", StringComparison.InvariantCulture) is false) + { + //#endif + // https://github.com/dotnet/efcore/issues/35443 + entityEntry.OriginalValues.SetValues(new Dictionary { { "ConcurrencyStamp", currentConcurrencyStamp } }); + //#if (IsInsideProjectTemplate == true) + } + //#endif + //#else + //#if (IsInsideProjectTemplate == true) + if (Database.ProviderName!.EndsWith("Sqlite", StringComparison.InvariantCulture)) + { + //#endif + entityEntry.CurrentValues.SetValues(new Dictionary { { "ConcurrencyStamp", RandomNumberGenerator.GetBytes(8) } }); + //#if (IsInsideProjectTemplate == true) + } + //#endif + //#endif } } - //#endif protected override void ConfigureConventions(ModelConfigurationBuilder configurationBuilder) { @@ -180,25 +187,31 @@ private void ConfigureIdentityTableNames(ModelBuilder builder) .ToTable("UserClaims"); } - //#if (database != "Sqlite") private void ConfigureConcurrencyStamp(ModelBuilder modelBuilder) { - //#if (IsInsideProjectTemplate == true) - if (Database.ProviderName!.EndsWith("Sqlite", StringComparison.InvariantCulture)) - return; - //#endif - foreach (var entityType in modelBuilder.Model.GetEntityTypes()) { foreach (var property in entityType.GetProperties() .Where(p => p.Name is "ConcurrencyStamp" && p.PropertyInfo?.PropertyType == typeof(byte[]))) { var builder = new PropertyBuilder(property); + + //#if (database == "Sqlite") + //#if (IsInsideProjectTemplate == true) + if (Database.ProviderName!.EndsWith("Sqlite", StringComparison.InvariantCulture)) + { + //#endif + builder.IsConcurrencyToken(); + //#if (IsInsideProjectTemplate == true) + continue; + } + //#endif + //#else builder.IsConcurrencyToken() .IsRowVersion(); //#if (IsInsideProjectTemplate == true) - if (Database.ProviderName.EndsWith("PostgreSQL", StringComparison.InvariantCulture)) + if (Database.ProviderName!.EndsWith("PostgreSQL", StringComparison.InvariantCulture)) { //#endif //#if (database == "PostgreSQL") @@ -209,8 +222,8 @@ private void ConfigureConcurrencyStamp(ModelBuilder modelBuilder) //#if (IsInsideProjectTemplate == true) } //#endif + //#endif } } } - //#endif } diff --git a/src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Api/Data/Migrations/20250217191441_InitialMigration.Designer.cs b/src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Api/Data/Migrations/20250303200825_InitialMigration.Designer.cs similarity index 99% rename from src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Api/Data/Migrations/20250217191441_InitialMigration.Designer.cs rename to src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Api/Data/Migrations/20250303200825_InitialMigration.Designer.cs index 02638e86ad..76d018c1e7 100644 --- a/src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Api/Data/Migrations/20250217191441_InitialMigration.Designer.cs +++ b/src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Api/Data/Migrations/20250303200825_InitialMigration.Designer.cs @@ -1,12 +1,17 @@ // +using System; +using Boilerplate.Server.Api.Data; +using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; #nullable disable namespace Boilerplate.Server.Api.Data.Migrations; [DbContext(typeof(AppDbContext))] -[Migration("20250217191441_InitialMigration")] +[Migration("20250303200825_InitialMigration")] partial class InitialMigration { /// @@ -25,6 +30,7 @@ protected override void BuildTargetModel(ModelBuilder modelBuilder) .HasColumnType("TEXT"); b.Property("ConcurrencyStamp") + .IsConcurrencyToken() .IsRequired() .HasColumnType("BLOB"); @@ -278,6 +284,7 @@ protected override void BuildTargetModel(ModelBuilder modelBuilder) .HasColumnType("TEXT"); b.Property("ConcurrencyStamp") + .IsConcurrencyToken() .IsRequired() .HasColumnType("BLOB"); diff --git a/src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Api/Data/Migrations/20250217191441_InitialMigration.cs b/src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Api/Data/Migrations/20250303200825_InitialMigration.cs similarity index 100% rename from src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Api/Data/Migrations/20250217191441_InitialMigration.cs rename to src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Api/Data/Migrations/20250303200825_InitialMigration.cs diff --git a/src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Api/Data/Migrations/AppDbContextModelSnapshot.cs b/src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Api/Data/Migrations/AppDbContextModelSnapshot.cs index 4fb2fba615..c0f6033569 100644 --- a/src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Api/Data/Migrations/AppDbContextModelSnapshot.cs +++ b/src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Api/Data/Migrations/AppDbContextModelSnapshot.cs @@ -1,5 +1,9 @@ // +using System; +using Boilerplate.Server.Api.Data; +using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; #nullable disable @@ -23,6 +27,7 @@ protected override void BuildModel(ModelBuilder modelBuilder) .HasColumnType("TEXT"); b.Property("ConcurrencyStamp") + .IsConcurrencyToken() .IsRequired() .HasColumnType("BLOB"); @@ -276,6 +281,7 @@ protected override void BuildModel(ModelBuilder modelBuilder) .HasColumnType("TEXT"); b.Property("ConcurrencyStamp") + .IsConcurrencyToken() .IsRequired() .HasColumnType("BLOB");