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();
}
}
}