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); /// EF 跟踪方式,先查询出完整的实体 Task UpdateFromDTOAsync(TFrom from, bool autoSave = false, bool ignoreDtoNullProperty = true, params EntityVerifyExp[] verify); #region EF 跟踪方式删除 (先查询完整实体,再删除) /// 批量删除,EF跟踪方式(所有查询出来,再删除 浪费性能,但是稽查 或者触发某些操作时,需要知道数据库实体信息 不可避免用这种) Task> DeleteFromQueryAsync(Expression> deleteFilter, bool autoSave = false, bool ignoreQueryFilter = false); Task> SoftDeleteFromQueryAsync(Expression> deleteFilter, bool autoSave = false, bool ignoreQueryFilter = false); Task DeleteFromQueryAsync(Guid id, bool autoSave = false, bool ignoreQueryFilter = false); #endregion #region EF跟踪方式 部分字段更新 会查询出来完整的实体 /// EF跟踪方式 已有查询好的,再更新部分字段 Task UpdateAsync(TEntity entity, Expression> updateFactory, bool autoSave = false, CancellationToken cancellationToken = default); /// EF跟踪方式 会去数据库查询完整的实体,再更新部分字段 Task UpdatePartialFromQueryAsync(Guid id, Expression> updateFactory, bool autoSave = false, bool ignoreQueryFilter = false, CancellationToken cancellationToken = default); /// 稽查用这个 EF跟踪方式 先查询出来所有实体,再更新部分字段 Task UpdatePartialFromQueryAsync(Expression> updateFilter, Expression> updateFactory, bool autoSave = false, bool ignoreQueryFilter = false, CancellationToken cancellationToken = default); #endregion #region EF跟踪方式 部分字段更新,不会去数据库查询完整实体 /// EF跟踪方式 生成 部分字段立即更新,不会去数据库查询完整的实体 Task UpdatePartialNowNoQueryAsync(Guid id, Expression> updateFactory, params EntityVerifyExp[] verify); /// EF跟踪方式 生成 部分字段更新,不会去数据库查询完整的实体 Task UpdatePartialNoQueryAsync(Guid id, Expression> updateFactory, bool autoSave = false, params EntityVerifyExp[] verify); #endregion #region 不走EF 跟踪机制,直接生成sql 批量更新或者删除 /// 批量删除,相当于原生sql, 没用EF跟踪方式(所有查询出来,再删除 浪费性能) Task BatchDeleteNoTrackingAsync(Expression> deleteFilter); /// 批量更新,相当于原生sql, 没用EF跟踪方式(所有查询出来,再更新 浪费性能) Task BatchUpdateNoTrackingAsync(Expression> where, Expression> updateFactory); #endregion /// 不常用 暂时废弃 Task UpdatePartialFieldsAsync(TEntity entity, string[] propertyNames, bool autoSave = false, bool ignoreEntityNullProperty = true, params EntityVerifyExp[] verify); } public interface ICommandRepository where TEntity : class { EntityEntry Attach(TEntity entity); EntityEntry Entry(TEntity t); /// ///不跟踪 查询单个实体,不会出现NUll /// /// /// /// Task FirstAsync(Expression> exp = null, bool isTracking = false,bool ignoreQueryFilters = false); /// ///跟踪 查询单个实体,会出现NUll /// /// /// /// Task FirstOrDefaultAsync(Expression> exp = null, bool ignoreQueryFilters = false); Task FirstOrDefaultNoTrackingAsync(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); Task> AddRangeAsync(IEnumerable entities, bool autoSave = false); Task SaveChangesAsync(CancellationToken cancellationToken = default); Task DeleteAsync(TEntity entity, bool autoSave = false, CancellationToken cancellationToken = default); } }