MyBookmark/Modules.User.Infrastructure.Database/UnitOfWork.cs

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;
}
}
}