首页 > 其他分享 >EF Core 仓储模式

EF Core 仓储模式

时间:2024-11-06 15:00:53浏览次数:5  
标签:Core Task void EF List 仓储 context query public

数据库:SqlServer为例

安装包:

 

数据库连接

DbContext

public class TestDbContext:DbContext
{
    public TestDbContext(DbContextOptions<TestDbContext> options) : base(options)
    {
    }
    public DbSet<User> Users { get; set; }
}

注册数据库上下文

builder.Services.AddDbContext<TestDbContext>(options =>
 {
     options.UseSqlServer("ConnectionString");
 });
 //依赖注入仓储
 builder.Services.AddTransient(typeof(IRepository<>),typeof(BaseRepository<>));

 

仓储接口----IRepository

public interface IRepository<T>  where T : class
{
    /// <summary>
    /// 新增
    /// </summary>
    /// <param name="t">要新增的信息</param>
    void Insert(T t);
    /// <summary>
    /// 新增
    /// </summary>
    /// <param name="t">要新增的信息</param>
    Task InsertAsync(T t);
    /// <summary>
    /// 批量新增
    /// </summary>
    /// <param name="t">要新增的信息</param>
    void InsertRange(List<T> t);
    /// <summary>
    /// 批量新增
    /// </summary>
    /// <param name="t">要新增的信息</param>
    Task InsertRangeAsync(List<T> t);
    /// <summary>
    /// 更新单个对象
    /// </summary>
    /// <param name="t">要更改的信息</param>
    void Update(T t);

    /// <summary>
    /// 单个更新对象-异步
    /// </summary>
    /// <param name="t">要更改的信息</param>
    Task UpdateAsync(T t);
    /// <summary>
    /// 批量更新
    /// </summary>
    /// <param name="t">要修改的信息</param>
    void UpdateRange(List<T> t);
    /// <summary>
    /// 批量更新-异步
    /// </summary>
    /// <param name="t">要修改的信息</param>
    Task UpdateRangeAsync(List<T> t);
    /// <summary>
    /// 删除
    /// </summary>
    /// <param name="t">要删除的信息</param>
    void Delete(T t);
    /// <summary>
    /// 删除-异步
    /// </summary>
    /// <param name="t">要删除的信息</param>
    Task DeleteAsync(T t);
    /// <summary>
    /// 批量删除
    /// </summary>
    /// <param name="t">要删除的信息</param>
    void DeleteRange(List<T> t);
    /// <summary>
    /// 批量删除-异步
    /// </summary>
    /// <param name="t">要删除的信息</param>
    Task DeleteRangeAsync(List<T> t);
    /// <summary>
    /// 单个查询
    /// </summary>
    /// <param name="id">要获取对象的编号</param>
    /// <returns>对象</returns>
    T Get(int id);

    /// <summary>
    /// 单个查询=异步
    /// </summary>
    /// <param name="id">要获取对象的编号</param>
    /// <returns></returns>
    Task<T> GetAsync(int id);
    /// <summary>
    /// 获取对象列表
    /// </summary>
    /// <returns>对象集合</returns>
   IQueryable<T> GetAll();
   
    /// <summary>
    /// 分页查询
    /// </summary>
    /// <param name="pageindex">页码</param>
    /// <param name="pagesize">每页获取数量</param>
    /// <param name="where">条件查询</param>
    /// <param name="orderBy">条件排序</param>
    /// <param name="orderAsc">true 升序</param>
    /// <param name="totalcount">总条数</param>
    /// <returns>对象集合</returns>
    IQueryable<T> GetPage(int pageindex, int pagesize, Func<T, bool> where, Func<T, DateTime> orderBy, bool orderAsc, out int totalcount);
}

 

仓储实现---BaseRepository

public class BaseRepository<T> : IRepository<T> where T : class, new()
{
    private readonly TestDbContext _context;

    public BaseRepository(TestDbContext context)
    {
        _context = context;
    }
    #region 删除
    /// <summary>
    /// 单个删除
    /// </summary>
    /// <param name="t">带主键的实体</param>
    public void Delete(T t)
    {
        _context.Remove(t);
    }

    /// <summary>
    /// 单个删除-异步
    /// </summary>
    /// <param name="t">带主键的实体</param>
    /// <returns></returns>
    public async Task DeleteAsync(T t)
    {
        await Task.Run(() => _context.Remove(t));
    }

    /// <summary>
    /// 批量删除
    /// </summary>
    /// <param name="t">带主键的实体集合</param>
    public void DeleteRange(List<T> t)
    {
        _context.RemoveRange(t);
    }

    /// <summary>
    /// 批量删除-异步
    /// </summary>
    /// <param name="t">带主键的实体集合</param>
    /// <returns></returns>
    public async Task DeleteRangeAsync(List<T> t)
    {
        await Task.Run(() => _context.Set<T>().RemoveRange(t));
    }
    #endregion

    #region 查询

    /// <summary>
    /// 单个查询
    /// </summary>
    /// <param name="id">主键</param>
    /// <returns></returns>
    public T Get(int id)
    {
        return _context.Find<T>(id) ?? new T();
    }
    /// <summary>
    /// 集合查询
    /// </summary>
    /// <returns></returns>
    public IQueryable<T> GetAll()
    {
        return _context.Set<T>().AsNoTracking();
    }
    /// <summary>
    /// 单个查询-异步
    /// </summary>
    /// <param name="id">主键</param>
    /// <returns></returns>
    public async Task<T> GetAsync(int id)
    {
        return await _context.FindAsync<T>(id) ?? new T();
    }
    /// <summary>
    /// 分页查询
    /// </summary>
    /// <param name="pageindex">页码</param>
    /// <param name="pagesize">每页获取数量</param>
    /// <param name="where"></param>
    /// <param name="orderBy"></param>
    /// <param name="orderAsc"></param>
    /// <param name="totalcount">结果总条数</param>
    /// <returns></returns>
    public IQueryable<T> GetPage(int pageindex, int pagesize, Func<T, bool> where, Func<T, DateTime> orderBy, bool orderAsc, out int totalcount)
    {
        var query = GetAll().Where(where);
        if (orderAsc)
        {
            query = query.OrderBy(orderBy);
            //query = query.OrderBy(orderBy).AsQueryable();
        }
        else
        {
            query = query.OrderBy(orderBy);
            //query = query.OrderByDescending(orderBy).AsQueryable() ;
        }
        totalcount = query.Count();
        return query.Skip((pageindex - 1) * pagesize).Take(pagesize).AsQueryable();
    }
    #endregion

    #region 新增
    /// <summary>
    /// 新增
    /// </summary>
    /// <param name="t"></param>
    public void Insert(T t)
    {
        _context.Add(t);
    }

    /// <summary>
    /// 单个新增
    /// </summary>
    /// <param name="t"></param>
    /// <returns></returns>
    public async Task InsertAsync(T t)
    {
        await _context.AddAsync(t);
    }

    /// <summary>
    /// 批量新增
    /// </summary>
    /// <param name="t"></param>
    public void InsertRange(List<T> t)
    {
        _context.AddRange(t);
    }

    /// <summary>
    /// 批量新增-异步
    /// </summary>
    /// <param name="t"></param>
    /// <returns></returns>
    public async Task InsertRangeAsync(List<T> t)
    {
        await _context.AddRangeAsync(t);
    }

    #endregion

    #region 更新
    /// <summary>
    /// 更新单个对象
    /// </summary>
    /// <param name="t">更新对象</param>
    public void Update(T t)
    {
        _context.Update(t);
    }

    /// <summary>
    /// 更新单个对象-异步
    /// </summary>
    /// <param name="t">更新对象</param>
    /// <returns></returns>
    public async Task UpdateAsync(T t)
    {
        await Task.Run(() => { _context.Update(t); });
    }

    /// <summary>
    /// 批量更新
    /// </summary>
    /// <param name="t"></param>
    public void UpdateRange(List<T> t)
    {
        _context.UpdateRange(t);
    }

    /// <summary>
    /// 批量更新-异步
    /// </summary>
    /// <param name="t"></param>
    /// <returns></returns>
    public async Task UpdateRangeAsync(List<T> t)
    {
        await Task.Run(() => { _context.UpdateRange(); });
    }
    #endregion

    public bool SaveChange()
    {
        return _context.SaveChanges() > 0;
    }
    public async Task<bool> SaveChangeAsync()
    {
        return await _context.SaveChangesAsync() > 0;
    }
}

 

仓储使用

public class UserService: IUserService
{
    private readonly IRepository<User> _userRepository;

    public UserService(IRepository<User> userRepository)
    {
        _userRepository = userRepository;
    }

    public async Task GetUsers(string name)
    {
        var result= await _userRepository.GetAll().Where(u => u.Name == name).ToListAsync();
    }
}

 

标签:Core,Task,void,EF,List,仓储,context,query,public
From: https://www.cnblogs.com/sugarwxx/p/18530220

相关文章

  • SpringBoot天元车业仓储物流管理系统k3o76 程序+源码+数据库+调试部署+开发环境
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表系统内容:出库管理员,入库管理员,车辆信息,客户信息,供应商,信息上报,货物信息,货物入库,货物出库,物流信息开题报告内容一、项目背景随着全球经济一体化的加速......
  • 解决mysql 的 [HY000][1356] View ‘information_schema.TABLES‘ references invalid
    同事在修改mysql用户权限时修改了关于mysql.infoschema的权限信息,导致无法访问information_schema库下的所有视图,使用数据库连接工具连接MySQL数据库时出现报错情况,使用MySQL终端登录并执行show命令同样报错。报错信息如下:ERROR1356(HY000):View'information_s......
  • SpringBoot源码解析(二):启动流程之引导上下文DefaultBootstrapContext
     SpringBoot的启动流程可以分为几个重要的步骤,其中之一是引导上下文(BootstrapContext)。引导上下文是在SpringBoot应用程序启动时创建的第一个Spring应用程序上下文,它负责加载和初始化SpringBoot的核心组件和配置。默认的引导上下文是通过DefaultBootstrapContext类来实现......
  • .Net Core NPOI 导出多级表头
     想要导出这样的表格 数据准备格式   附上源码1usingNPOI.HSSF.UserModel;2usingNPOI.SS.UserModel;3usingNPOI.SS.Util;4usingSystem.Data;5usingSystem.Text.RegularExpressions;67namespaceTestConsoleApp8{9//......
  • CompletableFuture异步编排接口优化方案
    接口优化方案(1)程序本身,减少不必要的条件判断、循环(2)减少数据库的交互次数,以及每个sql查询的数据量(列数和行数越少越好)(3)提高sql的性能,通过建立合适的索引(4)使用java8的stream流提高集合的遍历操作的效率(5)引入缓存,从redis中加载数据的效率高于mysql(6)使用多线程异步......
  • 如何使用nssm将asp.net core/.net6/.net8的webapi项目、mvc项目、控制台项目等注册为w
    nssm工具可以将asp.netFramework、asp.netcore、net6、.net8、.net10及后续本的的webapi项目、mvc项目、控制台项目、winform项、WPF项目等注册为windows服务。不仅限于上面这些,nssm可以将所有windows可执行文件注册为windows服务。下面,使用nssm将asp.net8的webapi项目注册为w......
  • CentOS 7 下安装部署.NET Core多版本环境
    文章目录一、前言1、什么时候需要配置多环境?2、环境信息二、部署过程1、SDK下载&安装基础依赖2、配置环境入口三、问题一、前言1、什么时候需要配置多环境?.NETCore作为.NET的开源版本,可以说是非常拥抱开源了,更新的力度也非常给力。却也从开源世界学了点坏东西,那......
  • 仓储物流机器人信息流【机器人本体软件信息流】【ROS框架】
    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录前言一、主控制程序二、各模块控制节点1.开机自检和信息打印节点2.定位节点1.二维码相机节点2.IMU节点3.陀螺仪节点4.里程计节点3.电池节点4.控制节点1.行走控制模块节点2.举升控制模块节点3.取......
  • .net core 项目使用log4net
    引入nuget包 1.增加一个log4Net.config的文件<?xmlversion="1.0"encoding="utf-8"?><log4net><appendername="DebugAppender"type="log4net.Appender.DebugAppender"><layouttype="log4n......
  • .net core 使用定时任务 quartz.net 实例
    项目是core3.1的 只用引用一个包就可以了引用配置Quartz首先创建一个任务工厂publicclassCronJobFactory:IJobFactory{privatereadonlyIServiceProvider_serviceProvider;publicCronJobFactory(IServiceProviderserviceProvider){_ser......