63 lines
2.5 KiB
C#
63 lines
2.5 KiB
C#
using Modules.User.Application;
|
|
using Modules.User.Database.Database;
|
|
|
|
namespace Modules.User.Database;
|
|
|
|
public class UnitOfWork(UserDbContext context) : IUnitOfWork
|
|
{
|
|
// public async Task<int> SaveChangesAsync(CancellationToken cancellationToken = default)
|
|
// {
|
|
// return await context.SaveChangesAsync(cancellationToken);
|
|
// }
|
|
public async Task<int> 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;
|
|
}
|
|
}
|
|
} |