using System; using System.Collections.Generic; using System.Linq.Expressions; using System.Text; using System.Threading; using System.Threading.Tasks; using IRaCIS.Core.Domain.Models; using Microsoft.EntityFrameworkCore.ChangeTracking; namespace IRaCIS.Core.Infra.EFCore { public interface ICommandRepository: ICommandRepository where TEntity : Entity { Task InsertOrUpdateAsync(TFrom from, bool autoSave = false, params EntityVerifyExp[] verify); Task InsertFromDTOAsync(TFrom from, bool autoSave = false, params EntityVerifyExp[] verify); Task UpdateFromDTOAsync(TFrom from, bool autoSave = false, bool ignoreDtoNullProperty = true, params EntityVerifyExp[] verify); /// EF跟踪方式 生成 部分字段更新 (只更新传递的字段名 new[] {nameof(User.Name), nameof(User.Age)) Task UpdatePartialFieldsAsync(TEntity entity, string[] propertyNames, bool autoSave = false, bool ignoreEntityNullProperty = true, params EntityVerifyExp[] verify); /// EF跟踪方式 生成 部分字段立即更新,默认会去处理更新更新人 更新时间 Task UpdateNowNoQueryAsync(Guid id, Expression> updateFactory, params EntityVerifyExp[] verify); /// EF跟踪方式 生成 部分字段更新, 通过主键id 和表达式树 更新部分字段,默认不提交事务,一般用于服务里面 和别的操作 一起提交事务 Task UpdateNoQueryAsync(Guid id, Expression> updateFactory, bool autoSave = false, params EntityVerifyExp[] verify); /// 批量删除,相当于原生sql, 没用EF跟踪方式(所有查询出来,再删除 浪费性能) Task BatchDeleteNoTrackingAsync(Expression> deleteFilter); /// 批量更新,相当于原生sql, 没用EF跟踪方式(所有查询出来,再更新 浪费性能) Task BatchUpdateNoTrackingAsync(Expression> where, Expression> updateFactory); /// 批量删除,EF跟踪方式(所有查询出来,再删除 浪费性能,但是稽查 或者触发某些操作时,需要知道数据库实体信息 不可避免用这种) Task> DeleteFromQueryAsync(Expression> deleteFilter, bool autoSave = false,bool ignoreQueryFilter = false); Task DeleteFromQueryAsync(Guid id, bool autoSave = false, bool ignoreQueryFilter = false); /// EF跟踪方式 已有查询好的,再更新部分字段 稽查的时候需要完整的实体信息 Task UpdateAsync(TEntity entity, Expression> updateFactory, bool autoSave = false, CancellationToken cancellationToken = default); /// EF跟踪方式 先查询出来,再更新部分字段 稽查的时候需要完整的实体信息 Task UpdateFromQueryAsync(Guid id, Expression> updateFactory, bool autoSave = false, bool ignoreQueryFilter = false, CancellationToken cancellationToken = default); Task UpdateFromQueryAsync(Expression> updateFilter, Expression> updateFactory, bool autoSave = false , bool ignoreQueryFilter = false,CancellationToken cancellationToken = default); } public interface ICommandRepository where TEntity : class { EntityEntry Attach(TEntity entity); EntityEntry Entry(TEntity t); Task FirstOrDefaultAsync(Expression> exp = null, bool ignoreQueryFilters = false); Task AnyAsync(Expression> exp,bool ignoreQueryFilters=false); Task MaxAsync(Expression> selector); Task CountAsync(Expression> whereLambda = null, bool ignoreQueryFilters = false); ValueTask AddAsync(TEntity entity, bool autoSave = false, CancellationToken cancellationToken = default,bool isSaveAudit=false); Task> AddRangeAsync(IEnumerable entities, bool isSaveAudit = false); //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); Task DeleteAsync(TEntity entity, bool autoSave = false, CancellationToken cancellationToken = default); //Task DeleteManyAsync(IEnumerable entities, bool autoSave = false, CancellationToken cancellationToken = default); //Task UpdateManyAsync(IEnumerable entities, bool autoSave = false, CancellationToken cancellationToken = default); } }