Files
SystemX.Web/Projects/SystemX.Core/SystemX.Core/DB/DBTransaction.cs

101 lines
3.0 KiB
C#

using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Storage;
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using SystemX.Core.Config.Model;
namespace SystemX.Core.DB
{
public static class DBTransaction
{
public static IEnumerable<TEntity>? GetEntity<TEntity>(this DbContext dbContext) where TEntity : class
{
IEnumerable<TEntity>? entity = default;
var type = dbContext.GetType();
try
{
foreach (var prop in type.GetProperties())
{
string propertyFullName = $"{prop.PropertyType.FullName}";
if (propertyFullName.ToLower().Contains(typeof(TEntity).Name.ToLower()))
{
entity = prop.GetValue(dbContext) as IEnumerable<TEntity>;
break;
}
}
}
catch (Exception ex)
{
Log4net.WriteLine(ex);
}
return entity;
}
#region Transaction
public static IDbContextTransaction CreateTransaction(this DbContext dbContext)
{
return dbContext.Database.BeginTransaction();
}
public static bool CloseTransaction(this DbContext dbContext, IDbContextTransaction transaction)
{
bool result = false;
try
{
dbContext.SaveChanges();
transaction.Commit();
result = true;
Log4net.WriteLine("Transaction Commit", LogType.Debug);
}
catch (Exception ex)
{
transaction.Rollback();
Log4net.WriteLine("Transaction Rollback", LogType.Error);
Log4net.WriteLine(ex);
}
transaction.Dispose();
return result;
}
#endregion
#region Transaction Async
public static async Task<IDbContextTransaction> CreateTransactionAsync(this DbContext dbContext, IsolationLevel isolationLevel = IsolationLevel.ReadCommitted)
{
return await dbContext.Database.BeginTransactionAsync(isolationLevel);
}
public static async Task<bool> CloseTransactionAsync(this DbContext dbContext, IDbContextTransaction transaction)
{
bool result = false;
try
{
await dbContext.SaveChangesAsync();
await transaction.CommitAsync();
result = true;
Log4net.WriteLine("Transaction Commit", LogType.Debug);
}
catch (Exception ex)
{
await transaction.RollbackAsync();
Log4net.WriteLine("Transaction Rollback", LogType.Error);
Log4net.WriteLine(ex);
}
await transaction.DisposeAsync();
return result;
}
#endregion
}
}