using KH.WMS.Core.Database.Repositories;
|
using KH.WMS.Core.DependencyInjection.ServiceLifetimes;
|
using Microsoft.AspNetCore.DataProtection.KeyManagement;
|
using Microsoft.Extensions.Logging;
|
using Microsoft.Extensions.Options;
|
using SqlSugar;
|
|
namespace KH.WMS.Core.Database.SqlSugar;
|
|
/// <summary>
|
/// SQL Sugar 数据库上下文(支持事务嵌套)
|
/// </summary>
|
[RegisteredService(Lifetime = Microsoft.Extensions.DependencyInjection.ServiceLifetime.Scoped)]
|
public class SqlSugarDbContext : IDbContext
|
{
|
private readonly ISqlSugarClient _sqlSugarClient;
|
private readonly ILogger<SqlSugarDbContext> _logger;
|
private readonly DatabaseOptions _options;
|
|
// 事务栈,用于支持嵌套事务
|
private readonly Stack<TransactionScope> _transactionScopes = new();
|
|
public SqlSugarDbContext(
|
ISqlSugarClient sqlSugarClient,
|
ILogger<SqlSugarDbContext> logger,
|
IOptions<DatabaseOptions> options)
|
{
|
_sqlSugarClient = sqlSugarClient;
|
_logger = logger;
|
_options = options.Value;
|
}
|
|
/// <summary>
|
/// 获取当前事务隔离级别
|
/// </summary>
|
public System.Data.IsolationLevel? CurrentIsolationLevel =>
|
_transactionScopes.Count > 0 ? _transactionScopes.Peek().IsolationLevel : null;
|
|
public ISqlSugarClient Db => _sqlSugarClient;
|
|
public async Task BeginTransactionAsync(System.Data.IsolationLevel isolationLevel = System.Data.IsolationLevel.ReadCommitted)
|
{
|
await _sqlSugarClient.Ado.BeginTranAsync(isolationLevel);
|
}
|
|
public async Task CommitTransactionAsync()
|
{
|
await _sqlSugarClient.Ado.CommitTranAsync();
|
_logger.LogInformation("事务已提交");
|
}
|
|
public async Task RollbackTransactionAsync()
|
{
|
await _sqlSugarClient.Ado.RollbackTranAsync();
|
_logger.LogInformation("事务已回滚");
|
}
|
|
public IRepository<T, TKey> GetRepository<T, TKey>() where T : class, new() where TKey : struct
|
{
|
return new RepositoryBase<T, TKey>(_sqlSugarClient, _logger);
|
}
|
|
public void Dispose()
|
{
|
// 如果有未提交的事务,自动回滚
|
|
_sqlSugarClient?.Ado.RollbackTran();
|
|
_sqlSugarClient?.Dispose();
|
}
|
|
IRepository<T, TKey> IDbContext.GetRepository<T, TKey>()
|
{
|
throw new NotImplementedException();
|
}
|
|
/// <summary>
|
/// 事务作用域
|
/// </summary>
|
private class TransactionScope
|
{
|
public System.Data.IsolationLevel IsolationLevel { get; }
|
public bool IsCompleted { get; set; }
|
public bool RequiresRollback { get; set; }
|
|
public TransactionScope(System.Data.IsolationLevel isolationLevel)
|
{
|
IsolationLevel = isolationLevel;
|
IsCompleted = false;
|
RequiresRollback = false;
|
}
|
}
|
}
|