using Microsoft.EntityFrameworkCore; using System.Linq.Expressions; namespace HuanMeng.DotNetCore.Base; /// /// 基本数据库操作,需要安装 Microsoft.EntityFrameworkCore 和 Microsoft.EntityFrameworkCore.Relational /// /// public class EfCoreDaoBase where TDbContext : DbContext { private TDbContext _context; public TDbContext Context => _context; /// /// 构造函数 /// /// public EfCoreDaoBase(TDbContext context) { _context = context ?? throw new ArgumentNullException(nameof(context)); } /// /// 是否手动提交 /// public bool IsManualSubmit { get; set; } /// /// SqlQueryRaw /// public async Task SqlQueryAsync(string sql, params object[] parameters) where T : class { return await Context.Database.SqlQueryRaw(sql, parameters).FirstOrDefaultAsync(); } /// /// SqlQueryList /// public async Task> SqlQueryListAsync(string sql, params object[] parameters) { return await Context.Database.SqlQueryRaw(sql, parameters).ToListAsync(); } /// /// ExecuteSql /// public async Task ExecuteSqlAsync(string sql, params object[] parameters) { var result = await Context.Database.ExecuteSqlRawAsync(sql, parameters); await AutoSaveChangesAsync(); return result; } /// /// 添加实体 /// public async Task AddAsync(T entity) where T : class { Context.Set().Add(entity); await AutoSaveChangesAsync(); } /// /// 批量添加实体 /// public async Task AddRangeAsync(IEnumerable entities) where T : class { Context.Set().AddRange(entities); await AutoSaveChangesAsync(); } /// /// 删除某个实体 /// public async Task DeleteAsync(T entity) where T : class { Context.Entry(entity).State = EntityState.Deleted; await AutoSaveChangesAsync(); } /// /// 更新实体 /// public async Task UpdateAsync(T entity) where T : class { if (Context.Entry(entity).State == EntityState.Detached) { Context.Set().Attach(entity); Context.Entry(entity).State = EntityState.Modified; } await AutoSaveChangesAsync(); } /// /// 清除上下文跟踪 /// public void RemoveTracking(T entity) where T : class { if (Context.Entry(entity).State != EntityState.Detached) { Context.Entry(entity).State = EntityState.Detached; } } /// /// 获取实体,根据主键 /// public async Task GetModelAsync(params object[] keyValues) where T : class { return await Context.Set().FindAsync(keyValues); } /// /// 获取实体,根据条件 /// public async Task GetModelAsync(Expression> where, bool isNoTracking = false) where T : class { var query = Context.Set().AsQueryable(); if (isNoTracking) query = query.AsNoTracking(); return await query.FirstOrDefaultAsync(where); } /// /// 获取列表数据 /// public IQueryable GetList(Expression> where, bool isNoTracking = false) where T : class { var query = Context.Set().Where(where); return isNoTracking ? query.AsNoTracking() : query; } /// /// 获取记录数量 /// public async Task GetCountAsync(Expression> where) where T : class { return await Context.Set().AsNoTracking().CountAsync(where); } /// /// 判断是否存在记录 /// public async Task ExistsAsync(Expression> where) where T : class { return await Context.Set().AsNoTracking().AnyAsync(where); } /// /// 根据提交状态决定是否自动保存更改 /// private async Task AutoSaveChangesAsync() { if (!IsManualSubmit) { await Context.SaveChangesAsync(); } } }