diff --git a/src/BuildingBlocks/BuildingBlocks.csproj b/src/BuildingBlocks/BuildingBlocks.csproj
index 2da37be..3135285 100644
--- a/src/BuildingBlocks/BuildingBlocks.csproj
+++ b/src/BuildingBlocks/BuildingBlocks.csproj
@@ -35,6 +35,7 @@
+
diff --git a/src/BuildingBlocks/Core/Model/Aggregate.cs b/src/BuildingBlocks/Core/Model/Aggregate.cs
index 42c87ca..14697d5 100644
--- a/src/BuildingBlocks/Core/Model/Aggregate.cs
+++ b/src/BuildingBlocks/Core/Model/Aggregate.cs
@@ -25,7 +25,7 @@ namespace BuildingBlocks.Core.Model
return dequeuedEvents;
}
- public long Version { get; set; } = -1;
+ public long Version { get; set; }
public TId Id { get; set; }
}
diff --git a/src/BuildingBlocks/EFCore/AppDbContextBase.cs b/src/BuildingBlocks/EFCore/AppDbContextBase.cs
index 88db419..57b4720 100644
--- a/src/BuildingBlocks/EFCore/AppDbContextBase.cs
+++ b/src/BuildingBlocks/EFCore/AppDbContextBase.cs
@@ -7,13 +7,16 @@ using Microsoft.EntityFrameworkCore.Storage;
namespace BuildingBlocks.EFCore;
+using System.Data;
+
public abstract class AppDbContextBase : DbContext, IDbContext
{
private readonly ICurrentUserProvider _currentUserProvider;
private IDbContextTransaction _currentTransaction;
- protected AppDbContextBase(DbContextOptions options, ICurrentUserProvider currentUserProvider = null) : base(options)
+ protected AppDbContextBase(DbContextOptions options, ICurrentUserProvider currentUserProvider = null) :
+ base(options)
{
_currentUserProvider = currentUserProvider;
}
@@ -30,7 +33,7 @@ public abstract class AppDbContextBase : DbContext, IDbContext
return;
}
- _currentTransaction ??= await Database.BeginTransactionAsync(cancellationToken);
+ _currentTransaction ??= await Database.BeginTransactionAsync(IsolationLevel.ReadCommitted, cancellationToken);
}
public async Task CommitTransactionAsync(CancellationToken cancellationToken = default)
@@ -68,7 +71,16 @@ public abstract class AppDbContextBase : DbContext, IDbContext
public override Task SaveChangesAsync(CancellationToken cancellationToken = default)
{
OnBeforeSaving();
- return base.SaveChangesAsync(cancellationToken);
+ try
+ {
+ return base.SaveChangesAsync(cancellationToken);
+ }
+ catch (DbUpdateConcurrencyException ex)
+ {
+ var data = ex.Entries.Single();
+ data.OriginalValues.SetValues(data.GetDatabaseValues() ?? throw new InvalidOperationException());
+ return base.SaveChangesAsync(cancellationToken);
+ }
}
public IReadOnlyList GetDomainEvents()
@@ -104,7 +116,6 @@ public abstract class AppDbContextBase : DbContext, IDbContext
case EntityState.Added:
entry.Entity.CreatedBy = userId;
entry.Entity.CreatedAt = DateTime.Now;
- entry.Entity.Version++;
break;
case EntityState.Modified:
diff --git a/src/BuildingBlocks/PersistMessageProcessor/Data/Migrations/20230113183839_initial.Designer.cs b/src/BuildingBlocks/PersistMessageProcessor/Data/Migrations/20230120222214_initial.Designer.cs
similarity index 98%
rename from src/BuildingBlocks/PersistMessageProcessor/Data/Migrations/20230113183839_initial.Designer.cs
rename to src/BuildingBlocks/PersistMessageProcessor/Data/Migrations/20230120222214_initial.Designer.cs
index e6ae47d..3265c90 100644
--- a/src/BuildingBlocks/PersistMessageProcessor/Data/Migrations/20230113183839_initial.Designer.cs
+++ b/src/BuildingBlocks/PersistMessageProcessor/Data/Migrations/20230120222214_initial.Designer.cs
@@ -12,7 +12,7 @@ using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
namespace BuildingBlocks.PersistMessageProcessor.Data.Migrations
{
[DbContext(typeof(PersistMessageDbContext))]
- [Migration("20230113183839_initial")]
+ [Migration("20230120222214_initial")]
partial class initial
{
///
diff --git a/src/BuildingBlocks/PersistMessageProcessor/Data/Migrations/20230113183839_initial.cs b/src/BuildingBlocks/PersistMessageProcessor/Data/Migrations/20230120222214_initial.cs
similarity index 100%
rename from src/BuildingBlocks/PersistMessageProcessor/Data/Migrations/20230113183839_initial.cs
rename to src/BuildingBlocks/PersistMessageProcessor/Data/Migrations/20230120222214_initial.cs
diff --git a/src/Services/Flight/src/Flight/Aircrafts/Models/Aircraft.cs b/src/Services/Flight/src/Flight/Aircrafts/Models/Aircraft.cs
index 6a67276..7c37fb5 100644
--- a/src/Services/Flight/src/Flight/Aircrafts/Models/Aircraft.cs
+++ b/src/Services/Flight/src/Flight/Aircrafts/Models/Aircraft.cs
@@ -1,5 +1,4 @@
using BuildingBlocks.Core.Model;
-using BuildingBlocks.IdsGenerator;
using Flight.Aircrafts.Features.CreateAircraft.Events.Domain.V1;
namespace Flight.Aircrafts.Models;
diff --git a/src/Services/Flight/src/Flight/Data/Configurations/AircraftConfiguration.cs b/src/Services/Flight/src/Flight/Data/Configurations/AircraftConfiguration.cs
index 2af92aa..71fc974 100644
--- a/src/Services/Flight/src/Flight/Data/Configurations/AircraftConfiguration.cs
+++ b/src/Services/Flight/src/Flight/Data/Configurations/AircraftConfiguration.cs
@@ -8,8 +8,13 @@ public class AircraftConfiguration : IEntityTypeConfiguration
{
public void Configure(EntityTypeBuilder builder)
{
+
builder.ToTable(nameof(Aircraft));
builder.HasKey(r => r.Id);
builder.Property(r => r.Id).ValueGeneratedNever();
+
+
+ // // ref: https://learn.microsoft.com/en-us/ef/core/saving/concurrency?tabs=fluent-api
+ builder.Property(r => r.Version).IsConcurrencyToken();
}
}
diff --git a/src/Services/Flight/src/Flight/Data/Configurations/AirportConfiguration.cs b/src/Services/Flight/src/Flight/Data/Configurations/AirportConfiguration.cs
index 8fc776a..b3f475b 100644
--- a/src/Services/Flight/src/Flight/Data/Configurations/AirportConfiguration.cs
+++ b/src/Services/Flight/src/Flight/Data/Configurations/AirportConfiguration.cs
@@ -8,9 +8,14 @@ public class AirportConfiguration: IEntityTypeConfiguration
{
public void Configure(EntityTypeBuilder builder)
{
+
builder.ToTable(nameof(Airport));
builder.HasKey(r => r.Id);
builder.Property(r => r.Id).ValueGeneratedNever();
+
+
+ // // ref: https://learn.microsoft.com/en-us/ef/core/saving/concurrency?tabs=fluent-api
+ builder.Property(r => r.Version).IsConcurrencyToken();
}
}
diff --git a/src/Services/Flight/src/Flight/Data/Configurations/FlightConfiguration.cs b/src/Services/Flight/src/Flight/Data/Configurations/FlightConfiguration.cs
index 181dbab..42e549e 100644
--- a/src/Services/Flight/src/Flight/Data/Configurations/FlightConfiguration.cs
+++ b/src/Services/Flight/src/Flight/Data/Configurations/FlightConfiguration.cs
@@ -17,6 +17,10 @@ public class FlightConfiguration : IEntityTypeConfiguration r.Id);
builder.Property(r => r.Id).ValueGeneratedNever();
+
+ // // ref: https://learn.microsoft.com/en-us/ef/core/saving/concurrency?tabs=fluent-api
+ builder.Property(r => r.Version).IsConcurrencyToken();
+
builder
.HasOne()
.WithMany()
diff --git a/src/Services/Flight/src/Flight/Data/Configurations/SeatConfiguration.cs b/src/Services/Flight/src/Flight/Data/Configurations/SeatConfiguration.cs
index 0ff9083..e1e6e0f 100644
--- a/src/Services/Flight/src/Flight/Data/Configurations/SeatConfiguration.cs
+++ b/src/Services/Flight/src/Flight/Data/Configurations/SeatConfiguration.cs
@@ -16,6 +16,9 @@ public class SeatConfiguration : IEntityTypeConfiguration
builder.HasKey(r => r.Id);
builder.Property(r => r.Id).ValueGeneratedNever();
+ // // ref: https://learn.microsoft.com/en-us/ef/core/saving/concurrency?tabs=fluent-api
+ builder.Property(r => r.Version).IsConcurrencyToken();
+
builder
.HasOne()
.WithMany()
diff --git a/src/Services/Flight/src/Flight/Data/FlightDbContext.cs b/src/Services/Flight/src/Flight/Data/FlightDbContext.cs
index 8274430..60e6e13 100644
--- a/src/Services/Flight/src/Flight/Data/FlightDbContext.cs
+++ b/src/Services/Flight/src/Flight/Data/FlightDbContext.cs
@@ -7,7 +7,6 @@ using Microsoft.EntityFrameworkCore;
namespace Flight.Data;
-
public sealed class FlightDbContext : AppDbContextBase
{
public FlightDbContext(DbContextOptions options, ICurrentUserProvider currentUserProvider) : base(
diff --git a/src/Services/Flight/src/Flight/Data/Migrations/20230113183335_Init.Designer.cs b/src/Services/Flight/src/Flight/Data/Migrations/20230120222458_Init.Designer.cs
similarity index 98%
rename from src/Services/Flight/src/Flight/Data/Migrations/20230113183335_Init.Designer.cs
rename to src/Services/Flight/src/Flight/Data/Migrations/20230120222458_Init.Designer.cs
index 9374273..b83b9b0 100644
--- a/src/Services/Flight/src/Flight/Data/Migrations/20230113183335_Init.Designer.cs
+++ b/src/Services/Flight/src/Flight/Data/Migrations/20230120222458_Init.Designer.cs
@@ -12,7 +12,7 @@ using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
namespace Flight.Data.Migrations
{
[DbContext(typeof(FlightDbContext))]
- [Migration("20230113183335_Init")]
+ [Migration("20230120222458_Init")]
partial class Init
{
///
@@ -64,6 +64,7 @@ namespace Flight.Data.Migrations
.HasColumnName("name");
b.Property("Version")
+ .IsConcurrencyToken()
.HasColumnType("bigint")
.HasColumnName("version");
@@ -112,6 +113,7 @@ namespace Flight.Data.Migrations
.HasColumnName("name");
b.Property("Version")
+ .IsConcurrencyToken()
.HasColumnType("bigint")
.HasColumnName("version");
@@ -191,6 +193,7 @@ namespace Flight.Data.Migrations
.HasColumnName("status");
b.Property("Version")
+ .IsConcurrencyToken()
.HasColumnType("bigint")
.HasColumnName("version");
@@ -255,6 +258,7 @@ namespace Flight.Data.Migrations
.HasColumnName("type");
b.Property("Version")
+ .IsConcurrencyToken()
.HasColumnType("bigint")
.HasColumnName("version");
diff --git a/src/Services/Flight/src/Flight/Data/Migrations/20230113183335_Init.cs b/src/Services/Flight/src/Flight/Data/Migrations/20230120222458_Init.cs
similarity index 100%
rename from src/Services/Flight/src/Flight/Data/Migrations/20230113183335_Init.cs
rename to src/Services/Flight/src/Flight/Data/Migrations/20230120222458_Init.cs
diff --git a/src/Services/Flight/src/Flight/Data/Migrations/FlightDbContextModelSnapshot.cs b/src/Services/Flight/src/Flight/Data/Migrations/FlightDbContextModelSnapshot.cs
index 3a944c1..8a46c93 100644
--- a/src/Services/Flight/src/Flight/Data/Migrations/FlightDbContextModelSnapshot.cs
+++ b/src/Services/Flight/src/Flight/Data/Migrations/FlightDbContextModelSnapshot.cs
@@ -61,6 +61,7 @@ namespace Flight.Data.Migrations
.HasColumnName("name");
b.Property("Version")
+ .IsConcurrencyToken()
.HasColumnType("bigint")
.HasColumnName("version");
@@ -109,6 +110,7 @@ namespace Flight.Data.Migrations
.HasColumnName("name");
b.Property("Version")
+ .IsConcurrencyToken()
.HasColumnType("bigint")
.HasColumnName("version");
@@ -188,6 +190,7 @@ namespace Flight.Data.Migrations
.HasColumnName("status");
b.Property("Version")
+ .IsConcurrencyToken()
.HasColumnType("bigint")
.HasColumnName("version");
@@ -252,6 +255,7 @@ namespace Flight.Data.Migrations
.HasColumnName("type");
b.Property("Version")
+ .IsConcurrencyToken()
.HasColumnType("bigint")
.HasColumnName("version");
diff --git a/src/Services/Passenger/src/Passenger/Data/Configurations/PassengerConfiguration.cs b/src/Services/Passenger/src/Passenger/Data/Configurations/PassengerConfiguration.cs
index eb787bd..9bfeff0 100644
--- a/src/Services/Passenger/src/Passenger/Data/Configurations/PassengerConfiguration.cs
+++ b/src/Services/Passenger/src/Passenger/Data/Configurations/PassengerConfiguration.cs
@@ -1,4 +1,3 @@
-using BuildingBlocks.EFCore;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata.Builders;
@@ -12,5 +11,8 @@ public class PassengerConfiguration: IEntityTypeConfiguration r.Id);
builder.Property(r => r.Id).ValueGeneratedNever();
+
+ // // ref: https://learn.microsoft.com/en-us/ef/core/saving/concurrency?tabs=fluent-api
+ builder.Property(r => r.Version).IsConcurrencyToken();
}
}
diff --git a/src/Services/Passenger/src/Passenger/Data/Migrations/20230113183717_initial.Designer.cs b/src/Services/Passenger/src/Passenger/Data/Migrations/20230120222631_initial.Designer.cs
similarity index 97%
rename from src/Services/Passenger/src/Passenger/Data/Migrations/20230113183717_initial.Designer.cs
rename to src/Services/Passenger/src/Passenger/Data/Migrations/20230120222631_initial.Designer.cs
index ee01a84..4a9eca5 100644
--- a/src/Services/Passenger/src/Passenger/Data/Migrations/20230113183717_initial.Designer.cs
+++ b/src/Services/Passenger/src/Passenger/Data/Migrations/20230120222631_initial.Designer.cs
@@ -12,7 +12,7 @@ using Passenger.Data;
namespace Passenger.Data.Migrations
{
[DbContext(typeof(PassengerDbContext))]
- [Migration("20230113183717_initial")]
+ [Migration("20230120222631_initial")]
partial class initial
{
///
@@ -68,6 +68,7 @@ namespace Passenger.Data.Migrations
.HasColumnName("passport_number");
b.Property("Version")
+ .IsConcurrencyToken()
.HasColumnType("bigint")
.HasColumnName("version");
diff --git a/src/Services/Passenger/src/Passenger/Data/Migrations/20230113183717_initial.cs b/src/Services/Passenger/src/Passenger/Data/Migrations/20230120222631_initial.cs
similarity index 100%
rename from src/Services/Passenger/src/Passenger/Data/Migrations/20230113183717_initial.cs
rename to src/Services/Passenger/src/Passenger/Data/Migrations/20230120222631_initial.cs
diff --git a/src/Services/Passenger/src/Passenger/Data/Migrations/PassengerDbContextModelSnapshot.cs b/src/Services/Passenger/src/Passenger/Data/Migrations/PassengerDbContextModelSnapshot.cs
index 20ec96f..6612a81 100644
--- a/src/Services/Passenger/src/Passenger/Data/Migrations/PassengerDbContextModelSnapshot.cs
+++ b/src/Services/Passenger/src/Passenger/Data/Migrations/PassengerDbContextModelSnapshot.cs
@@ -65,6 +65,7 @@ namespace Passenger.Data.Migrations
.HasColumnName("passport_number");
b.Property("Version")
+ .IsConcurrencyToken()
.HasColumnType("bigint")
.HasColumnName("version");