文件内容 ICollectAuditDb.cs 5 KB 5307 字符
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.ChangeTracking;
using Microsoft.EntityFrameworkCore.Infrastructure;

namespace PasteApeart.EntityFrameworkCore
{
    /// <summary>
    /// DbContext的提取interface
    /// </summary>
    public interface ICollectAuditDb
    {
        // ========== DbSet 相关 ==========

        /// <summary>
        /// 
        /// </summary>
        /// <typeparam name="TEntity"></typeparam>
        /// <returns></returns>
        DbSet<TEntity> Set<TEntity>() where TEntity : class;

        // ========== 添加操作(保持 object 类型)==========

        /// <summary>
        /// 
        /// </summary>
        /// <param name="entity"></param>
        /// <returns></returns>
        EntityEntry Add(object entity);

        /// <summary>
        /// 
        /// </summary>
        /// <param name="entities"></param>
        void AddRange(params object[] entities);

        /// <summary>
        /// 
        /// </summary>
        /// <param name="entities"></param>
        void AddRange(IEnumerable<object> entities);

        /// <summary>
        /// 
        /// </summary>
        /// <param name="entities"></param>
        /// <returns></returns>
        Task AddRangeAsync(params object[] entities);

        /// <summary>
        /// 
        /// </summary>
        /// <param name="entities"></param>
        /// <param name="cancellationToken"></param>
        /// <returns></returns>
        Task AddRangeAsync(IEnumerable<object> entities, CancellationToken cancellationToken = default);

        // ========== 更新操作(保持 object 类型)==========
        /// <summary>
        /// 
        /// </summary>
        /// <param name="entity"></param>
        /// <returns></returns>
        EntityEntry Update(object entity);

        /// <summary>
        /// 
        /// </summary>
        /// <param name="entities"></param>
        void UpdateRange(params object[] entities);

        /// <summary>
        /// 
        /// </summary>
        /// <param name="entities"></param>
        void UpdateRange(IEnumerable<object> entities);

        // ========== 删除操作(保持 object 类型)==========
        /// <summary>
        /// 
        /// </summary>
        /// <param name="entity"></param>
        /// <returns></returns>
        EntityEntry Remove(object entity);

        /// <summary>
        /// 
        /// </summary>
        /// <param name="entities"></param>
        void RemoveRange(params object[] entities);

        /// <summary>
        /// 
        /// </summary>
        /// <param name="entities"></param>
        void RemoveRange(IEnumerable<object> entities);

        // ========== Attach 操作(保持 object 类型)==========

        /// <summary>
        /// 
        /// </summary>
        /// <param name="entity"></param>
        /// <returns></returns>
        EntityEntry Attach(object entity);

        /// <summary>
        /// 
        /// </summary>
        /// <param name="entities"></param>
        void AttachRange(params object[] entities);

        /// <summary>
        /// 
        /// </summary>
        /// <param name="entities"></param>
        void AttachRange(IEnumerable<object> entities);

        // ========== 查找操作 ==========

        /// <summary>
        /// 
        /// </summary>
        /// <param name="entityType"></param>
        /// <param name="keyValues"></param>
        /// <returns></returns>
#pragma warning disable CS8632 // 只能在 "#nullable" 注释上下文内的代码中使用可为 null 的引用类型的注释。
        ValueTask<object?> FindAsync(Type entityType, params object?[]? keyValues);
#pragma warning restore CS8632 // 只能在 "#nullable" 注释上下文内的代码中使用可为 null 的引用类型的注释。

        /// <summary>
        /// 
        /// </summary>
        /// <typeparam name="TEntity"></typeparam>
        /// <param name="keyValues"></param>
        /// <returns></returns>
#pragma warning disable CS8632 // 只能在 "#nullable" 注释上下文内的代码中使用可为 null 的引用类型的注释。
        ValueTask<TEntity?> FindAsync<TEntity>(params object?[]? keyValues) where TEntity : class;
#pragma warning restore CS8632 // 只能在 "#nullable" 注释上下文内的代码中使用可为 null 的引用类型的注释。

        // ========== 条目操作 ==========

        /// <summary>
        /// 
        /// </summary>
        /// <typeparam name="TEntity"></typeparam>
        /// <param name="entity"></param>
        /// <returns></returns>
        EntityEntry<TEntity> Entry<TEntity>(TEntity entity) where TEntity : class;

        /// <summary>
        /// 
        /// </summary>
        /// <param name="entity"></param>
        /// <returns></returns>
        EntityEntry Entry(object entity);

        // ========== 保存操作 ==========

        /// <summary>
        /// 
        /// </summary>
        /// <returns></returns>
        int SaveChanges();

        /// <summary>
        /// 
        /// </summary>
        /// <param name="cancellationToken"></param>
        /// <returns></returns>
        Task<int> SaveChangesAsync(CancellationToken cancellationToken = default);
        //Task<int> SaveChangesWithAuditAsync(CancellationToken cancellationToken = default);

        // ========== 其他属性 ==========

        /// <summary>
        /// 
        /// </summary>
        ChangeTracker ChangeTracker { get; }

        /// <summary>
        /// 
        /// </summary>
        DatabaseFacade Database { get; }
    }

}
​ ​