diff --git a/IRaCIS.Core.Application/Service/Visit/SubjectService.cs b/IRaCIS.Core.Application/Service/Visit/SubjectService.cs index fdae5b066..7f3dbec5a 100644 --- a/IRaCIS.Core.Application/Service/Visit/SubjectService.cs +++ b/IRaCIS.Core.Application/Service/Visit/SubjectService.cs @@ -191,7 +191,7 @@ namespace IRaCIS.Application.Services } var isSuccess = await _subjectRepository.BatchDeleteAsync(u => u.Id == id); - await _subjectVisitRepository.TrackingBatchDeleteAsync(u => u.SubjectId == id); + await _subjectVisitRepository.TrackingDeleteFromQueryAsync(u => u.SubjectId == id); var subvisit = await _subjectVisitRepository.Where(x => x.SubjectId == id).ToListAsync(); diff --git a/IRaCIS.Core.Application/TestService.cs b/IRaCIS.Core.Application/TestService.cs index 4db7986ff..dcb75eadc 100644 --- a/IRaCIS.Core.Application/TestService.cs +++ b/IRaCIS.Core.Application/TestService.cs @@ -23,7 +23,7 @@ namespace IRaCIS.Application.Services public string Get(testModel testModel) { - var tt= _dicRepository.QueryThenPartiallyUpdateAsync(Guid.Parse("e2b97a6c-35a6-4aa3-7f27-08da13ab33ff"), t => new Dictionary() { Description = "xxxxx" }, true).Result; + var tt= _dicRepository.TrackingUpdateFromQueryAsync(Guid.Parse("e2b97a6c-35a6-4aa3-7f27-08da13ab33ff"), t => new Dictionary() { Description = "xxxxx" }, true).Result; //var d = _repository.Where(t => t.FullName.Contains("cc")).Select(t => t.FullName).FirstOrDefault(); diff --git a/IRaCIS.Core.Infra.EFCore/Repository/ICommandRepository.cs b/IRaCIS.Core.Infra.EFCore/Repository/ICommandRepository.cs index dbc5b5f8e..0f7e0f466 100644 --- a/IRaCIS.Core.Infra.EFCore/Repository/ICommandRepository.cs +++ b/IRaCIS.Core.Infra.EFCore/Repository/ICommandRepository.cs @@ -34,18 +34,22 @@ namespace IRaCIS.Core.Infra.EFCore Task BatchUpdateAsync(Expression> where, Expression> updateFactory); + + /// 批量删除,EF跟踪方式(所有查询出来,再删除 浪费性能,但是稽查 或者触发某些操作时,需要知道数据库实体信息 不可避免用这种) - Task> TrackingBatchDeleteAsync(Expression> deleteFilter); + Task> TrackingDeleteFromQueryAsync(Expression> deleteFilter, bool autoSave = false); + + Task TrackingDeleteFromQueryAsync(Guid id, bool autoSave = false); /// EF跟踪方式 已有查询好的,再更新部分字段 稽查的时候需要完整的实体信息 - Task PartialUpdateAsync(TEntity entity, Expression> updateFactory, + Task TrackingUpdateAsync(TEntity entity, Expression> updateFactory, bool autoSave = false, CancellationToken cancellationToken = default); /// EF跟踪方式 先查询出来,再更新部分字段 稽查的时候需要完整的实体信息 - Task QueryThenPartiallyUpdateAsync(Guid id, Expression> updateFactory, + Task TrackingUpdateFromQueryAsync(Guid id, Expression> updateFactory, bool autoSave = false, CancellationToken cancellationToken = default); - Task QueryThenPartiallyUpdateAsync(Expression> updateFilter, + Task TrackingUpdateFromQueryAsync(Expression> updateFilter, Expression> updateFactory, bool autoSave = false, CancellationToken cancellationToken = default); diff --git a/IRaCIS.Core.Infra.EFCore/Repository/Repository.cs b/IRaCIS.Core.Infra.EFCore/Repository/Repository.cs index 82deb07e1..45159a3f4 100644 --- a/IRaCIS.Core.Infra.EFCore/Repository/Repository.cs +++ b/IRaCIS.Core.Infra.EFCore/Repository/Repository.cs @@ -224,7 +224,9 @@ namespace IRaCIS.Core.Infra.EFCore } - public async Task QueryThenPartiallyUpdateAsync(Expression> updateFilter, + + + public async Task TrackingUpdateFromQueryAsync(Expression> updateFilter, Expression> updateFactory, bool autoSave = false, CancellationToken cancellationToken = default) { @@ -237,14 +239,14 @@ namespace IRaCIS.Core.Infra.EFCore foreach (var needUpdateEntity in searchEntityList) { - await PartialUpdateAsync(needUpdateEntity, updateFactory, autoSave); + await TrackingUpdateAsync(needUpdateEntity, updateFactory, autoSave); } } /// EF跟踪方式 外层先有查询好的完成实体,再更新部分字段 稽查的时候需要完整的实体信息 - public async Task PartialUpdateAsync(TEntity waitModifyEntity, Expression> updateFactory, bool autoSave = false, CancellationToken cancellationToken = default) + public async Task TrackingUpdateAsync(TEntity waitModifyEntity, Expression> updateFactory, bool autoSave = false, CancellationToken cancellationToken = default) { var entityEntry = _dbContext.Entry(waitModifyEntity); entityEntry.State = EntityState.Detached; @@ -260,11 +262,11 @@ namespace IRaCIS.Core.Infra.EFCore /// EF跟踪方式 先查询出来,再更新部分字段 稽查的时候需要完整的实体信息 - public async Task QueryThenPartiallyUpdateAsync(Guid id, Expression> updateFactory, + public async Task TrackingUpdateFromQueryAsync(Guid id, Expression> updateFactory, bool autoSave = false, CancellationToken cancellationToken = default) { //不跟踪 查询出来的实体就是Detached - var searchEntity = await _dbSet.AsNoTracking().FirstOrDefaultAsync(t => t.Id == id); + var searchEntity = await _dbSet.AsNoTracking().IgnoreQueryFilters().FirstOrDefaultAsync(t => t.Id == id); if (searchEntity == null) { @@ -311,14 +313,29 @@ namespace IRaCIS.Core.Infra.EFCore { _dbSet.Remove(entity); - return await SaveChangesAsync(autoSave); + } + + /// EF跟踪方式(查询出来,再删除 浪费性能,但是稽查 或者触发某些操作时,需要知道数据库实体信息 不可避免用这种) + public async Task TrackingDeleteFromQueryAsync(Guid id, bool autoSave = false) + { + var waitDelete = await _dbSet.IgnoreQueryFilters().Where(t=>t.Id== id).FirstOrDefaultAsync(); + + if (waitDelete == null) + { + throw new BusinessValidationFailedException( + " Delete object not exist in db,Please check if the parameter Id is passed incorrectly"); + } + + await DeleteAsync(waitDelete, autoSave); + + return waitDelete; } /// 批量删除,EF跟踪方式(所有查询出来,再删除 浪费性能,但是稽查 或者触发某些操作时,需要知道数据库实体信息 不可避免用这种) - public async Task> TrackingBatchDeleteAsync(Expression> deleteFilter) + public async Task> TrackingDeleteFromQueryAsync(Expression> deleteFilter, bool autoSave = false) { var waitDeleteList = await _dbSet.IgnoreQueryFilters().Where(deleteFilter).ToListAsync(); @@ -326,6 +343,9 @@ namespace IRaCIS.Core.Infra.EFCore { await DeleteAsync(deleteItem, false); } + + await SaveChangesAsync(autoSave); + return waitDeleteList; }