using Microsoft.Extensions.Logging;
using SqlSugar;
using System;
namespace ReZero.SuperAPI
{
///
/// Represents a database context for handling database operations using SqlSugar.
///
public class DatabaseContext
{
///
/// Gets the SqlSugar client instance for performing database operations.
///
public ISqlSugarClient SugarClient { get; private set; }
///
/// Initializes a new instance of the DatabaseContext class with the provided database connection configuration.
///
/// Database connection configuration.
public DatabaseContext(SuperAPIConnectionConfig rezeroConnectionConfig)
{
var connectionConfig = new ConnectionConfig()
{
DbType = rezeroConnectionConfig.DbType,
ConnectionString = rezeroConnectionConfig.ConnectionString,
IsAutoCloseConnection = true,
MoreSettings=new ConnMoreSettings()
{
SqlServerCodeFirstNvarchar=true
}
};
InitializeExternalServices(connectionConfig);
ConfigureExternalServices(connectionConfig);
// Create a new SqlSugar client instance using the provided connection configuration.
SugarClient = new SqlSugarClient(connectionConfig, db =>
{
db.QueryFilter.AddTableFilter(it => it.IsDeleted == false);
db.Aop.OnLogExecuting = (s, p) =>
ReZero.DependencyInjection.DependencyResolver.GetLogger().LogInformation(UtilMethods.GetNativeSql(s, p));
});
}
///
/// Configures external services for the provided database connection configuration.
///
/// Database connection configuration.
private static void ConfigureExternalServices(ConnectionConfig connectionConfig)
{
connectionConfig.ConfigureExternalServices.EntityService = (x, p) =>
{
// Convert the database column name to snake case.
p.DbColumnName = UtilMethods.ToUnderLine(p.DbColumnName);
};
connectionConfig.ConfigureExternalServices.EntityNameService = (x, p) =>
{
// Convert the database table name to snake case.
p.DbTableName = UtilMethods.ToUnderLine(p.DbTableName);
};
}
///
/// Initializes external services for the provided database connection configuration.
///
/// Database connection configuration.
private static void InitializeExternalServices(ConnectionConfig connectionConfig)
{
// Adds comments to explain the purpose of the method.
// Sets the ConfigureExternalServices property of the provided connection configuration to a new instance of ConfigureExternalServices if it is null.
connectionConfig.ConfigureExternalServices = connectionConfig.ConfigureExternalServices ?? new ConfigureExternalServices();
}
}
}