using Modules.User.Application; using Modules.User.Database.Database; namespace Modules.User.Database; public class UnitOfWork(UserDbContext context) : IUnitOfWork { // public async Task SaveChangesAsync(CancellationToken cancellationToken = default) // { // return await context.SaveChangesAsync(cancellationToken); // } public async Task SaveChangesAsync(CancellationToken cancellationToken = default) { try { return await context.SaveChangesAsync(cancellationToken); // try // { // return await context.SaveChangesAsync(cancellationToken); // } // catch (Microsoft.EntityFrameworkCore.DbUpdateConcurrencyException ex) // { // var hadSessionConflict = false; // // foreach (var entry in ex.Entries) // { // var name = entry.Metadata.Name; // if (name != typeof(Database.Entities.Session).FullName && // name != typeof(Database.Entities.ClientInfo).FullName) continue; // // hadSessionConflict = true; // var dbValues = await entry.GetDatabaseValuesAsync(cancellationToken); // if (dbValues is null) // { // entry.State = Microsoft.EntityFrameworkCore.EntityState.Detached; // } // else // { // // подтягиваем актуальное “оригинальное” состояние и повторим // entry.OriginalValues.SetValues(dbValues); // } // } // // if (hadSessionConflict) // return await context.SaveChangesAsync(cancellationToken); // // throw; // } } catch (Microsoft.EntityFrameworkCore.DbUpdateConcurrencyException ex) { Console.WriteLine($"Microsoft.EntityFrameworkCore.DbUpdateConcurrencyException:\r\n{ex.Message}"); foreach (var e in ex.Entries) { var key = string.Join(",", e.Properties .Where(p => p.Metadata.IsPrimaryKey()) .Select(p => $"{p.Metadata.Name}={p.CurrentValue}")); Console.WriteLine($"Concurrency on {e.Metadata.Name} [{key}]"); } throw; } } }