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