From c393ea325c9a5465618a5f3e745a1f9af76dd845 Mon Sep 17 00:00:00 2001 From: Loretta Date: Sun, 30 Jun 2024 15:34:19 +0200 Subject: [PATCH] improvements, fixes, etc... --- AyCode.Database/DataLayers/AcDalBase.cs | 6 +++++ AyCode.Database/Extensions/AcDalExtension.cs | 25 ++++++++++++++++++++ 2 files changed, 31 insertions(+) diff --git a/AyCode.Database/DataLayers/AcDalBase.cs b/AyCode.Database/DataLayers/AcDalBase.cs index 45bc7e6..25efb2a 100644 --- a/AyCode.Database/DataLayers/AcDalBase.cs +++ b/AyCode.Database/DataLayers/AcDalBase.cs @@ -86,6 +86,12 @@ public abstract class AcDalBase : IAcDalBase where TDbCo public bool Transaction(Func callbackTransactionBody, bool throwException = false) => this.Transaction(callbackTransactionBody, throwException); + public Task UpdateSafeAsync(TEntity entity, Func? callbackTransactionBody = null, bool throwException = false) where TEntity : class, IEntityGuid + => this.UpdateSafeAsync(entity, callbackTransactionBody, throwException); + public TEntity? UpdateSafe(TEntity entity, Func? callbackTransactionBody = null, bool throwException = false) where TEntity : class, IEntityGuid + => this.UpdateSafe(entity, callbackTransactionBody, throwException); + + public override string ToString() { return Name; diff --git a/AyCode.Database/Extensions/AcDalExtension.cs b/AyCode.Database/Extensions/AcDalExtension.cs index 50f7974..d2a3c1a 100644 --- a/AyCode.Database/Extensions/AcDalExtension.cs +++ b/AyCode.Database/Extensions/AcDalExtension.cs @@ -3,6 +3,7 @@ using AyCode.Database.DataLayers; using AyCode.Database.DbContexts; using AyCode.Interfaces.Entities; using AyCode.Utils.Extensions; +using Microsoft.EntityFrameworkCore; namespace AyCode.Database.Extensions; @@ -46,4 +47,28 @@ public static class AcDalExtension return acDal.Context.Transaction(callbackTransactionBody, throwException); } } + + public static Task UpdateSafeAsync(this IAcDalBase acDal, TEntity entity, Func? callbackTransactionBody = null, bool throwException = false) where TDbContext : AcDbContextBase where TEntity : class, IEntityGuid + => TaskHelper.ToThreadPoolTask(() => acDal.UpdateSafe(entity, callbackTransactionBody, throwException)); + + public static TEntity? UpdateSafe(this IAcDalBase acDal, TEntity entity, Func? callbackTransactionBody = null, bool throwException = false) where TDbContext : AcDbContextBase where TEntity : class, IEntityGuid + { + TEntity? updateEntity = null; + + var isSuccess = acDal.Context.Transaction(ctx => + { + updateEntity = ctx.Set().FirstOrDefault(x => x.Id == entity.Id); + if (updateEntity == null) return false; + + //ctx.Entry(updateEntity).State = EntityState.Detached; + ctx.Entry(updateEntity).CurrentValues.SetValues(entity); + + if (callbackTransactionBody == null) + return ctx.Update(updateEntity).State == EntityState.Modified; + + return callbackTransactionBody.Invoke(ctx, updateEntity); + }, throwException); + + return isSuccess ? updateEntity : null; + } } \ No newline at end of file