diff --git a/IRaCIS.Core.Infra.EFCore/Context/IRaCISDBContext.cs b/IRaCIS.Core.Infra.EFCore/Context/IRaCISDBContext.cs index 539b6f78c..9756286f9 100644 --- a/IRaCIS.Core.Infra.EFCore/Context/IRaCISDBContext.cs +++ b/IRaCIS.Core.Infra.EFCore/Context/IRaCISDBContext.cs @@ -10,6 +10,7 @@ using Microsoft.EntityFrameworkCore.ChangeTracking; using System.Reflection; using EntityFramework.Exceptions.SqlServer; using IRaCIS.Core.Domain.Share; +using IRaCIS.Core.Infra.EFCore.ValueGenerator; using MassTransit; using Microsoft.EntityFrameworkCore.Infrastructure; using Microsoft.EntityFrameworkCore.Metadata; @@ -99,12 +100,18 @@ namespace IRaCIS.Core.Infra.EFCore if (typeof(ISoftDelete).IsAssignableFrom(entityType.ClrType)) { entityType.AddSoftDeleteQueryFilter(); + + //Generator Detached 状态才会进去 误用 + //modelBuilder.Entity(entityType.ClrType).Property(nameof(ISoftDelete.DeletedTime)).HasValueGenerator().ValueGeneratedOnAddOrUpdate(); + } if (typeof(Entity).IsAssignableFrom(entityType.ClrType)) { modelBuilder.Entity(entityType.ClrType).Property(nameof(Entity.Id)).HasValueGenerator(); } + + } } @@ -312,19 +319,24 @@ namespace IRaCIS.Core.Infra.EFCore public virtual DbSet CommonDocument { get; set; } - public override int SaveChanges() - { - UpdateAuditInfo(); - return base.SaveChanges(); - } + #region 废弃 - public override Task SaveChangesAsync(CancellationToken cancellationToken = new CancellationToken()) - { - UpdateAuditInfo(); - return base.SaveChangesAsync(cancellationToken); - } + //public override int SaveChanges() + //{ + // UpdateAuditInfo(); + // return base.SaveChanges(); + //} - #region 重写savechange方式 统一增加审计信息 CreateUserId CreateTime UpdateTime UpdateUserId 可用事件绑定的方式UpdateAuitUser + //public override Task SaveChangesAsync(CancellationToken cancellationToken = new CancellationToken()) + //{ + // UpdateAuditInfo(); + // return base.SaveChangesAsync(cancellationToken); + //} + + + /// + /// 重写savechange方式 统一增加审计信息 CreateUserId CreateTime UpdateTime UpdateUserId 可用事件绑定的方式UpdateAuitUser + /// private void UpdateAuditInfo() { @@ -343,6 +355,7 @@ namespace IRaCIS.Core.Infra.EFCore break; case EntityState.Modified: + if (t.Entity is IAuditUpdate updateEntity1) { updateEntity1.UpdateTime = DateTime.UtcNow.AddHours(8); @@ -357,6 +370,7 @@ namespace IRaCIS.Core.Infra.EFCore } } + break; //添加的时候,更新审计字段也赋值 case EntityState.Added: @@ -396,10 +410,14 @@ namespace IRaCIS.Core.Infra.EFCore } - #endregion - #region 事件绑定的方式 更新审计信息 + + /// + /// 事件绑定的方式 更新审计信息 废弃 + /// + /// + /// private void UpdateAuitUser(object sender, EntityEntryEventArgs e) { if (e.Entry.Entity is IAuditUpdate updateEntity) @@ -450,8 +468,13 @@ namespace IRaCIS.Core.Infra.EFCore } } + #endregion + + + + } public class MySequentialGuidValueGenerator : ValueGenerator diff --git a/IRaCIS.Core.Infra.EFCore/Context/Triggers/AuditAddTrigger.cs b/IRaCIS.Core.Infra.EFCore/Context/Triggers/AuditAddTrigger.cs new file mode 100644 index 000000000..bff32b4d4 --- /dev/null +++ b/IRaCIS.Core.Infra.EFCore/Context/Triggers/AuditAddTrigger.cs @@ -0,0 +1,55 @@ +using System; +using System.Threading; +using System.Threading.Tasks; +using EntityFrameworkCore.Triggered; +using IRaCIS.Core.Domain.Models; +using IRaCIS.Core.Domain.Share; + +namespace IRaCIS.Core.Application.Triggers +{ + public class AuditAddTrigger: IBeforeSaveTrigger + { + private readonly IUserInfo _userInfo; + + public AuditAddTrigger(IUserInfo userInfo) + { + _userInfo = userInfo; + } + + public Task BeforeSave(ITriggerContext context, CancellationToken cancellationToken) + { + if (context.ChangeType == ChangeType.Added) + { + context.Entity.CreateUserId = _userInfo.Id; + context.Entity.CreateTime = DateTime.UtcNow.AddHours(8); + + } + + return Task.CompletedTask; + + } + } + + public class AuditAddWithUsernameTrigger : IBeforeSaveTrigger + { + private readonly IUserInfo _userInfo; + + public AuditAddWithUsernameTrigger(IUserInfo userInfo) + { + _userInfo = userInfo; + } + + public Task BeforeSave(ITriggerContext context, CancellationToken cancellationToken) + { + if (context.ChangeType == ChangeType.Added) + { + context.Entity.CreateUserId = _userInfo.Id; + context.Entity.CreateUser = _userInfo.UserName; + context.Entity.CreateTime = DateTime.UtcNow.AddHours(8); + } + + return Task.CompletedTask; + + } + } +} \ No newline at end of file diff --git a/IRaCIS.Core.Infra.EFCore/Context/Triggers/AuditUpdateTrigger.cs b/IRaCIS.Core.Infra.EFCore/Context/Triggers/AuditUpdateTrigger.cs new file mode 100644 index 000000000..b6463e5c1 --- /dev/null +++ b/IRaCIS.Core.Infra.EFCore/Context/Triggers/AuditUpdateTrigger.cs @@ -0,0 +1,33 @@ +using System; +using System.Threading; +using System.Threading.Tasks; +using EntityFrameworkCore.Triggered; +using IRaCIS.Core.Domain.Models; +using IRaCIS.Core.Domain.Share; + +namespace IRaCIS.Core.Application.Triggers +{ + public class AuditUpdateTrigger: IBeforeSaveTrigger + { + private readonly IUserInfo _userInfo; + + public AuditUpdateTrigger(IUserInfo userInfo) + { + _userInfo = userInfo; + } + + public Task BeforeSave(ITriggerContext context, CancellationToken cancellationToken) + { + if (context.ChangeType == ChangeType.Modified|| context.ChangeType == ChangeType.Added) + { + context.Entity.UpdateUserId = _userInfo.Id; + context.Entity.UpdateTime=DateTime.UtcNow.AddHours(8); + } + + + + return Task.CompletedTask; + + } + } +} \ No newline at end of file diff --git a/IRaCIS.Core.Infra.EFCore/Context/Triggers/SoftDeleteTrigger.cs b/IRaCIS.Core.Infra.EFCore/Context/Triggers/SoftDeleteTrigger.cs new file mode 100644 index 000000000..912368c83 --- /dev/null +++ b/IRaCIS.Core.Infra.EFCore/Context/Triggers/SoftDeleteTrigger.cs @@ -0,0 +1,31 @@ +using System; +using System.Threading; +using System.Threading.Tasks; +using EntityFrameworkCore.Triggered; +using IRaCIS.Core.Domain.Models; + +namespace IRaCIS.Core.Application.Triggers +{ + + public class SoftDeleteTrigger : IBeforeSaveTrigger + { + + public Task BeforeSave(ITriggerContext context, CancellationToken cancellationToken) + { + if (context.ChangeType == ChangeType.Modified) + { + if (context.Entity.IsDeleted) + { + context.Entity.DeletedTime=DateTime.UtcNow.AddHours(8); + } + else + { + context.Entity.DeletedTime = null; + } + } + + return Task.CompletedTask; + + } + } +} \ No newline at end of file diff --git a/IRaCIS.Core.Infra.EFCore/Context/ValueGenerator/UploadTotalMillisecondsIntervalGenerator.cs b/IRaCIS.Core.Infra.EFCore/Context/ValueGenerator/UploadTotalMillisecondsIntervalGenerator.cs index 9a9a3b640..18f4519d4 100644 --- a/IRaCIS.Core.Infra.EFCore/Context/ValueGenerator/UploadTotalMillisecondsIntervalGenerator.cs +++ b/IRaCIS.Core.Infra.EFCore/Context/ValueGenerator/UploadTotalMillisecondsIntervalGenerator.cs @@ -1,12 +1,10 @@ using System; using IRaCIS.Core.Domain.Models; -using IRaCIS.Core.Domain.Share; using Microsoft.EntityFrameworkCore.ChangeTracking; using Microsoft.EntityFrameworkCore.ValueGeneration; namespace IRaCIS.Core.Infra.EFCore.ValueGenerator { - /// /// 上传监控 时间间隔存储 需要按照这个字段进行排序 /// @@ -32,4 +30,5 @@ namespace IRaCIS.Core.Infra.EFCore.ValueGenerator } public override bool GeneratesTemporaryValues => false; } + } \ No newline at end of file diff --git a/IRaCIS.Core.Infra.EFCore/Repository/Repository.cs b/IRaCIS.Core.Infra.EFCore/Repository/Repository.cs index 0947b5034..d8a001307 100644 --- a/IRaCIS.Core.Infra.EFCore/Repository/Repository.cs +++ b/IRaCIS.Core.Infra.EFCore/Repository/Repository.cs @@ -273,9 +273,11 @@ namespace IRaCIS.Core.Infra.EFCore var bindings = ((MemberInitExpression)updateFactory.Body).Bindings.ToList(); + var hasPropNameList = bindings.Select(t => t.Member.Name).ToList(); + + if (typeof(IAuditUpdate).IsAssignableFrom(typeof(TEntity))) { - var hasPropNameList = bindings.Select(t => t.Member.Name).ToList(); if (!hasPropNameList.Contains(nameof(IAuditUpdate.UpdateTime))) {