diff --git a/IRaCIS.Core.Application/Triggers/SubjectVisitImageDateTrigger.cs b/IRaCIS.Core.Application/Triggers/SubjectVisitImageDateTrigger.cs index 7be6aaf09..5233ddcce 100644 --- a/IRaCIS.Core.Application/Triggers/SubjectVisitImageDateTrigger.cs +++ b/IRaCIS.Core.Application/Triggers/SubjectVisitImageDateTrigger.cs @@ -16,6 +16,7 @@ namespace IRaCIS.Core.Application.Triggers public async Task AfterSave(ITriggerContext context, CancellationToken cancellationToken) { var subjectVisitId = context.Entity.SubjectVisitId; + if (context.ChangeType == ChangeType.Added || context.ChangeType == ChangeType.Modified) { await UpdateSubjectVisitImageDateAsync(context.Entity.SubjectVisitId); diff --git a/IRaCIS.Core.Infra.EFCore/Repository/ICommandRepository.cs b/IRaCIS.Core.Infra.EFCore/Repository/ICommandRepository.cs index f221a6a83..48a3dc141 100644 --- a/IRaCIS.Core.Infra.EFCore/Repository/ICommandRepository.cs +++ b/IRaCIS.Core.Infra.EFCore/Repository/ICommandRepository.cs @@ -33,6 +33,10 @@ namespace IRaCIS.Core.Infra.EFCore /// 批量更新,相当于原生sql, 没用EF跟踪方式(所有查询出来,再更新 浪费性能) Task BatchUpdateAsync(Expression> where, Expression> updateFactory); + + /// 批量删除,EF跟踪方式(所有查询出来,再删除 浪费性能,但是稽查 或者触发某些操作时,需要知道数据库实体信息 不可避免用这种) + Task TrackingBatchDeleteAsync(Expression> deleteFilter); + } public interface ICommandRepository where TEntity : class @@ -53,7 +57,7 @@ namespace IRaCIS.Core.Infra.EFCore Task> AddRangeAsync(IEnumerable entities); - Task AddRangeAsync(IEnumerable entities, bool autoSave = false, CancellationToken cancellationToken = default); + //Task AddRangeAsync(IEnumerable entities, bool autoSave = false, CancellationToken cancellationToken = default); // 不建议使用,使用跟踪,然后save 部分字段更新,此种方式是更新所有字段 Task UpdateAsync(TEntity entity, bool autoSave = false, CancellationToken cancellationToken = default); Task SaveChangesAsync(CancellationToken cancellationToken = default); diff --git a/IRaCIS.Core.Infra.EFCore/Repository/Repository.cs b/IRaCIS.Core.Infra.EFCore/Repository/Repository.cs index d3c0d50d2..8ece566a4 100644 --- a/IRaCIS.Core.Infra.EFCore/Repository/Repository.cs +++ b/IRaCIS.Core.Infra.EFCore/Repository/Repository.cs @@ -42,7 +42,50 @@ namespace IRaCIS.Core.Infra.EFCore #region 异步部分 + /// EF跟踪方式 添加 + public async ValueTask AddAsync(TEntity entity, bool autoSave = false, CancellationToken cancellationToken = default) + { + await _dbSet.AddAsync(entity).ConfigureAwait(false); + + await AddInspectionAsync(entity); + + if (autoSave) + { + await SaveChangesAsync(cancellationToken); + } + + return entity; + } + + + private async Task AddInspectionAsync(TEntity entity) + { + List datas = new List(); + + var createtime = DateTime.Now.AddSeconds(1); + + // 受试者 + if (typeof(TEntity) == typeof(Subject)) + { + Subject data = entity as Subject; + datas.Add(new DataInspection() + { + TrialId = data.TrialId, + SiteId = data.SiteId, + SubjectId = data.Id, + SubjectCode = data.Code, + IsSign = false, + CreateTime = createtime, + Identification = "Init|Subject|Status|Subject", + JsonDetail = JsonConvert.SerializeObject(new + { + Status = "新增", + }) + }); + } + await AddListInspectionRecordAsync(datas); + } public async Task InsertOrUpdateAsync(TFrom from, bool autoSave = false, params EntityVerifyExp[] verify) { @@ -98,46 +141,21 @@ namespace IRaCIS.Core.Infra.EFCore public async Task InsertFromDTOAsync(TFrom from, bool autoSave = false, params EntityVerifyExp[] verify) { - List datas = new List(); var entity = _mapper.Map(from); await EntityVerifyAsync(true, verify); - await _dbSet.AddAsync(entity).ConfigureAwait(false); - await SaveChangesAsync(autoSave); + entity= await AddAsync(entity); - - var createtime = DateTime.Now.AddSeconds(1); - - // 受试者 - if (typeof(TEntity) == typeof(Subject)) - { - Subject data = entity as Subject; - datas.Add(new DataInspection() - { - TrialId = data.TrialId, - SiteId = data.SiteId, - SubjectId = data.Id, - SubjectCode = data.Code, - IsSign = false, - CreateTime = createtime, - Identification = "Init|Subject|Status|Subject", - JsonDetail = JsonConvert.SerializeObject(new - { - Status = "新增", - }) - }); - } - await AddListInspectionRecordAsync(datas); - - await SaveChangesAsync(autoSave); return entity; } + + #region 稽查 /// /// 添加稽查记录 @@ -221,8 +239,8 @@ namespace IRaCIS.Core.Infra.EFCore join child in _dbContext.FrontAuditConfig.AsQueryable().Where(x => x.DateType != null && x.DateType != string.Empty) on parent.Id equals child.ParentId select new DateDto() { - Code= child.Code, - DateType= child.DateType, + Code = child.Code, + DateType = child.DateType, }).ToListAsync(); var JsonData = JsonConvert.DeserializeObject>(Data.JsonDetail); @@ -230,7 +248,7 @@ namespace IRaCIS.Core.Infra.EFCore foreach (var item in JsonData.Keys) { var datefirst = list.FirstOrDefault(x => x.Code.ToLower() == item.ToLower()); - if (datefirst != null&& !IsNullOrEmpty(JsonData[item])) + if (datefirst != null && !IsNullOrEmpty(JsonData[item])) { try { @@ -251,7 +269,7 @@ namespace IRaCIS.Core.Infra.EFCore continue; } } - + } @@ -270,7 +288,7 @@ namespace IRaCIS.Core.Infra.EFCore { #region 项目名称 - var trialdata = await _dbContext.Trial.Select(x=>new { x.Id, x.ResearchProgramNo, x.ExperimentName, }).FirstOrDefaultAsync(x => x.Id == Data.TrialId); + var trialdata = await _dbContext.Trial.Select(x => new { x.Id, x.ResearchProgramNo, x.ExperimentName, }).FirstOrDefaultAsync(x => x.Id == Data.TrialId); Data.ResearchProgramNo = trialdata?.ResearchProgramNo; if (IsNullOrEmpty(Data.TrialName)) { @@ -283,11 +301,11 @@ namespace IRaCIS.Core.Infra.EFCore Data.SiteCode = (await _dbContext.TrialSite.IgnoreQueryFilters().FirstOrDefaultAsync(x => x.TrialId == Data.TrialId && x.SiteId == Data.SiteId))?.TrialSiteCode; - - if (IsNullOrEmpty(Data.SiteName)&& Data.SiteId!=null) + + if (IsNullOrEmpty(Data.SiteName) && Data.SiteId != null) { - var sitedata = await _dbContext.Site.Where(x => x.Id == Data.SiteId).Select(x=>new { x.SiteName}).FirstOrDefaultAsync(); + var sitedata = await _dbContext.Site.Where(x => x.Id == Data.SiteId).Select(x => new { x.SiteName }).FirstOrDefaultAsync(); Data.SiteName = sitedata?.SiteName; } #endregion @@ -298,14 +316,14 @@ namespace IRaCIS.Core.Infra.EFCore if (IsNullOrEmpty(Data.SubjectCode) && Data.SubjectId != null) { - Data.SubjectCode = (await _dbContext.Subject.Where(x => x.Id == Data.SubjectId).Select(x=>new {x.Code }).FirstOrDefaultAsync())?.Code; + Data.SubjectCode = (await _dbContext.Subject.Where(x => x.Id == Data.SubjectId).Select(x => new { x.Code }).FirstOrDefaultAsync())?.Code; } #endregion #region 访视 if (IsNullOrEmpty(Data.SubjectVisitName)) { - Data.SubjectVisitName = (await _dbContext.SubjectVisit.Where(x => x.Id == Data.SubjectVisitId).Select(x=>new { x.VisitName}).FirstOrDefaultAsync())?.VisitName; + Data.SubjectVisitName = (await _dbContext.SubjectVisit.Where(x => x.Id == Data.SubjectVisitId).Select(x => new { x.VisitName }).FirstOrDefaultAsync())?.VisitName; } #endregion @@ -629,42 +647,19 @@ namespace IRaCIS.Core.Infra.EFCore return await query.FirstOrDefaultAsync(exp).ConfigureAwait(false); } - public async ValueTask AddAsync(TEntity entity, bool autoSave = false, CancellationToken cancellationToken = default) - { - - await _dbSet.AddAsync(entity).ConfigureAwait(false); - - if (autoSave) - { - await SaveChangesAsync(cancellationToken); - } - - return entity; - } public async Task> AddRangeAsync(IEnumerable entities) { - await _dbSet.AddRangeAsync(entities).ConfigureAwait(false); + foreach (var addEntity in entities) + { + await AddAsync(addEntity); + } return entities; } - public async Task AddRangeAsync(IEnumerable entities, bool autoSave = false, CancellationToken cancellationToken = default) - { - await _dbSet.AddRangeAsync(entities).ConfigureAwait(false); - - if (autoSave) - { - return await SaveChangesAsync(cancellationToken); - } - else - { - return false; - } - } - @@ -699,7 +694,7 @@ namespace IRaCIS.Core.Infra.EFCore return whereLambda == null ? await query.AsNoTracking().CountAsync() : await query.AsNoTracking().CountAsync(whereLambda); } - + /// EF跟踪方式 更新,全字段更新 public async Task UpdateAsync(TEntity entity, bool autoSave = false, CancellationToken cancellationToken = default) { _dbSet.Update(entity); @@ -715,14 +710,11 @@ namespace IRaCIS.Core.Infra.EFCore } - + /// EF跟踪方式 删除 public async Task DeleteAsync(TEntity entity, bool autoSave = false, CancellationToken cancellationToken = default) { _dbSet.Remove(entity); - //var entry = _dbSet.Attach(entity); - //entry.State = EntityState.Deleted; - if (autoSave) { return await SaveChangesAsync(cancellationToken); @@ -734,13 +726,27 @@ namespace IRaCIS.Core.Infra.EFCore } + /// 批量删除,EF跟踪方式(所有查询出来,再删除 浪费性能,但是稽查 或者触发某些操作时,需要知道数据库实体信息 不可避免用这种) + public async Task TrackingBatchDeleteAsync(Expression> deleteFilter) + { + var waitDeleteList = await _dbSet.IgnoreQueryFilters().Where(deleteFilter).ToListAsync(); + foreach (var deleteItem in waitDeleteList) + { + await DeleteAsync(deleteItem, false); + } + + } + + + /// 批量删除,相当于原生sql, 没用EF跟踪方式(所有查询出来,再删除 浪费性能) public async Task BatchDeleteAsync(Expression> deleteFilter) { return await _dbSet.IgnoreQueryFilters().Where(deleteFilter).BatchDeleteAsync() > 0; } + /// 批量更新,相当于原生sql, 没用EF跟踪方式(所有查询出来,再更新 浪费性能) public async Task BatchUpdateAsync(Expression> where, Expression> updateFactory) { @@ -757,7 +763,7 @@ namespace IRaCIS.Core.Infra.EFCore } - if (!hasPropNameList.Contains( nameof(IAuditUpdate.UpdateUserId))) + if (!hasPropNameList.Contains(nameof(IAuditUpdate.UpdateUserId))) { bindings.Add(Expression.Bind(typeof(TEntity).GetMember(nameof(IAuditUpdate.UpdateUserId))[0], Expression.Constant(_userInfo.Id))); @@ -932,6 +938,20 @@ namespace IRaCIS.Core.Infra.EFCore } } + public async Task AddRangeAsync(IEnumerable entities, bool autoSave = false, CancellationToken cancellationToken = default) + { + await _dbSet.AddRangeAsync(entities).ConfigureAwait(false); + + if (autoSave) + { + return await SaveChangesAsync(cancellationToken); + } + else + { + return false; + } + } + #endregion }