前言

EF Core是我们.NET日常开发中比较常用的ORM框架,今天大姚要分享的内容是如何使用EF Core Generic Repository通用仓储库来快速实现EF Core数据仓储模式。

EF Core Generic Repository介绍

该库是EF Core ORM的通用仓储库实现,旨在简化开发人员为每个.NET Core和.NET项目编写仓储层的工作。通过使用这个库,开发人员可以更轻松地管理数据访问层,提高开发效率。

值得推荐的.NET ORM框架

对于还不知道怎么选择.NET ORM框架的同学可以看下面这两篇文章,希望对你会有所帮助。

数据仓储(Repository)介绍

Repository(仓储)是DDD(领域驱动设计)中的经典思想,可以归纳为介于实际业务层(领域层)和数据访问层之间的层,能让领域层能在感觉不到数据访问层的情况下,完成与数据库的交互和以往的DAO(数据访问)层相比,Repository层的设计理念更偏向于面向对象,而淡化直接对数据表进行的CRUD操作。

类库特点

  • 该库可以在任何. NET Core或.NET应用程序上运行,该应用程序具有.NET Core 3.1、.NET Standard 2.1和.NET 5.0+支持。
  • 提供了带有数据库事务支持的通用存储库。
  • 拥有所有必需的方法,以任何你想要的方式查询数据,而无需从存储库获取IQueryable。
  • 支持Specification<T>模式,使你能够动态构建查询,即延迟查询构建。
  • 具有针对你的查询的数据库级投影支持。
  • 支持针对你的关系型数据库运行原始SQL命令。
  • 支持选择是否要跟踪你的查询实体/实体。
  • 支持在确实需要时重置你的EF Core DbContext状态。
  • 具有完整的单元测试支持。
  • 支持分页、原始SQL查询支持复杂类型和原始类型。

项目源代码

新建控制台应用

新建名为:GenericRepositoryExercise控制台应用。

相关类库安装

搜索名为:TanvirArjel.EFCore.GenericRepository的NuGet安装。

因为我们要访问Microsoft SQL Server数据库,因此我们需要安装Microsoft.EntityFrameworkCore.SqlServer NuGet包。

新建UserInfo类

    [Table("UserInfo")]
    public class UserInfo
    {
        [Key]
        public int Id { get; set; }

        [Required]
        public string Name { get; set; }

        [Required]
        public int Age { get; set; }

        [Required]
        public string Email { get; set; }
    }

新建数据库上下文类

新建名为:TestDbContext数据库上下文类。

    public class TestDbContext : DbContext
    {
        public TestDbContext(DbContextOptions<TestDbContext> options) : base(options)
        {
        }

        public DbSet<UserInfo> UserInfo { get; set; }
    }

新建UserInfoService(包含常见CRUD)

      public class UserInfoService
    {
        private readonly IRepository<TestDbContext> _repository;

        public UserInfoService(IRepository<TestDbContext> repository)
        {
            _repository = repository;
        }

        public async Task UserInfoCRUD()
        {
            // 创建一个新用户
            var newUser = new UserInfo { Name = "daydayup", Age = 28, Email = "daydayup@example.com" };
            await _repository.AddAsync(newUser);
            await _repository.SaveChangesAsync();

            // 更新用户信息
            newUser.Email = "new_updated@example.com";
            _repository.Update(newUser);
            await _repository.SaveChangesAsync();

            // 删除用户
            _repository.Remove(newUser);
            await _repository.SaveChangesAsync();

            // 查询所有用户
            var users = await _repository.GetListAsync<UserInfo>();
            foreach (var user in users)
            {
                Console.WriteLine($"Id: {user.Id}, Name: {user.Name}, Age: {user.Age}, Email: {user.Email}");
            }

            //查询总数
            var totalCount = await _repository.GetCountAsync<UserInfo>();

            // 根据条件查询用户
            var filteredUsers = await _repository.GetListAsync<UserInfo>(u => u.Age > 25);
            foreach (var user in filteredUsers)
            {
                Console.WriteLine($"Id: {user.Id}, Name: {user.Name}, Age: {user.Age}, Email: {user.Email}");
            }
        }
    }

在Program.cs中注册相关服务

      internal class Program
    {
        static async Task Main(string[] args)
        {
            //设置依赖注入容器
            IServiceCollection services = new ServiceCollection();
            services.AddScoped<UserInfoService>();

            var connectionString = "Server=.;Database=MyTestDB;User Id=test;Password=123456;trustServerCertificate=true;";
            services.AddDbContext<TestDbContext>(option => option.UseSqlServer(connectionString));

            //注册DbConext后立即调用它
            services.AddGenericRepository<TestDbContext>();

            IServiceProvider serviceProvider = services.BuildServiceProvider();

            //从容器中获取UserInfoService实例并执行操作
            var userInfoService = serviceProvider.GetRequiredService<UserInfoService>();
            await userInfoService.UserInfoCRUD();
        }
    }

项目源码地址

更多项目实用功能和特性欢迎前往项目开源地址查看,别忘了给项目一个Star支持。

优秀项目和框架精选

该项目已收录到C#/.NET/.NET Core优秀项目和框架精选中,关注优秀项目和框架精选能让你及时了解C#、.NET和.NET Core领域的最新动态和最佳实践,提高开发工作效率和质量。坑已挖,欢迎大家踊跃提交PR推荐或自荐(让优秀的项目和框架不被埋没)。

https://github.com/YSGStudyHards/DotNetGuide/blob/main/docs/DotNet/DotNetProjectPicks.md

DotNetGuide技术社区交流群

  • DotNetGuide技术社区是一个面向.NET开发者的开源技术社区,旨在为开发者们提供全面的C#/.NET/.NET Core相关学习资料、技术分享和咨询、项目框架推荐、求职和招聘资讯、以及解决问题的平台。
  • 在DotNetGuide技术社区中,开发者们可以分享自己的技术文章、项目经验、学习心得、遇到的疑难技术问题以及解决方案,并且还有机会结识志同道合的开发者。
  • 我们致力于构建一个积极向上、和谐友善的.NET技术交流平台。无论您是初学者还是有丰富经验的开发者,我们都希望能为您提供更多的价值和成长机会。

欢迎加入DotNetGuide技术社区微信交流群

一个库帮你快速实现EF Core数据仓储模式的更多相关文章

  1. EF Core 快速上手——EF Core 入门

    EF Core 快速上手--EF Core 介绍 本章导航 从本书你能学到什么 对EF6.x 程序员的一些话 EF Core 概述 1.3.1 ORM框架的缺点 第一个EF Core应用   本文是对 ...

  2. EF Core 快速上手——EF Core的三种主要关系类型

    系列文章 EF Core 快速上手--EF Core 入门 本节导航 三种数据库关系类型建模 Migration方式创建和习修改数据库 定义和创建应用DbContext 将复杂查询拆分为子查询   本 ...

  3. [EF Core]数据迁移(二)

    摘要 在实际项目中,大多都需要对业务逻辑以及操作数据库的逻辑进行分成操作,这个时候该如何进行数据的迁移呢? 步骤 上篇文章:EF Core数据迁移操作 比如,我们将数据上下文放在了Data层. 看一下 ...

  4. EF Core 数据变更自动审计设计

    EF Core 数据变更自动审计设计 Intro 有的时候我们需要知道每个数据表的变更记录以便做一些数据审计,数据恢复以及数据同步等之类的事情, EF 自带了对象追踪,使得我们可以很方便的做一些审计工 ...

  5. EF Core数据访问入门

    重要概念 Entity Framework (EF) Core 是轻量化.可扩展.开源和跨平台的数据访问技术,它还是一 种对象关系映射器 (ORM),它使 .NET 开发人员能够使用面向对象的思想处理 ...

  6. EF Core数据迁移操作

    摘要 在开发中,使用EF code first方式开发,那么如果涉及到数据表的变更,该如何做呢?当然如果是新项目,删除数据库,然后重新生成就行了,那么如果是线上的项目,数据库中已经有数据了,那么删除数 ...

  7. asp.net core 一个中小型项目实战的起手式——项目搭建与仓储模式下的持久层创建(1)

    常规的中小型项目搭建方式一般是三层架构加上mvc与webapi作为一个主要框架,再加上一些第三方库,例如orm框架(EF.SqlSugar.Dapper等),API文档工具(Swagger)这些的应用 ...

  8. EF Core 数据过滤

    1 前言 本文致力于将一种动态数据过滤的方案描述出来(基于 EF Core 官方的数据筛选器),实现自动注册,多个条件过滤,单条件禁用(实际上是参考ABP的源码),并尽量让代码保持 EF Core 的 ...

  9. ef core数据迁移的一点小感悟

    ef core在针对mysql数据迁移的时候,有些时候没法迁移...有两种情况没法迁移,一种是因为efcore的bug问题导致没法迁移,这个在github上有个问题集,另外一种是对数据表进行较大幅度的 ...

  10. .Net Core3.1 + EF Core + LayUI 封装的MVC版后台管理系统

    项目名称:学生信息管理系统1.0 后台框架:.Net Core 3.1 + EF Core    yrjw.ORM.Chimp 前端框架:ASP.NET Core MVC  +  LayUI + Bo ...

随机推荐

  1. 【LeetCode二叉树#10】从中序与后序(或者前序)遍历序列构造二叉树(首次构造二叉树)

    从中序与后序遍历序列构造二叉树 力扣题目链接(opens new window) 根据一棵树的中序遍历与后序遍历构造二叉树. 注意: 你可以假设树中没有重复的元素. 例如,给出 中序遍历 inorde ...

  2. 【算法day1】复杂度和简单排序算法(1)

    复杂度和简单排序算法 时间复杂度 以一个排序(选择排序)操作举例 假设我有一个数组,我要找出其中的最小值放到0的位置上 那么 第一次我会遍历数组中N个数(在0位置处),找出最小的数交换到0位置[看了( ...

  3. 在Windows环境中配置使用我们搭建的DNS服务器

    1.修改网卡的设置,首选DNS用我们自己的 2.在命令行中测试 专业的nslookup 3.已知的问题 每次在DNS服务器的web界面中,修改了解析,必须用docker restart dns命令,把 ...

  4. 【Azure Function】修改Function执行的Timeout时间

    问题描述 Azure Function默认的Timeout时间是否可以调整呢? 问题解答 可以的,根据创建Function的时候选择的定价层不同,Function 默认的Timeout时间也不同. 消 ...

  5. [Python] 子线程退出孙线程不退出

    遇到了一个大坑! 如图,在子线程ThreadFunc退出之后,ThreadFunc2依旧在运行... 根本不会结束 但是官方文档中说明了,只要设置了daemon不为None 就能设置子线程是守护线程, ...

  6. Java interface 接口 新特性

    1 package com.bytezreo.interfacetest; 2 3 public class SubClass2 { 4 public static void main(String[ ...

  7. springMvc精简整理

    精简共分步 新建一个web工程  导入核心就二包,因为springmvc 包自己有依赖 <?xml version="1.0" encoding="UTF-8&qu ...

  8. Spring整合mybatis使用xml配置事务

    自己准备开始教授Java相关的技术,Spring框架是必须让学生学习的框架之一.里面有一个事务相关的 配置,以前刚学习Spring框架的时候有接触过,只是过了很多年,很多东西都已经淡忘.再来回忆一下 ...

  9. 已安装docker-compose,安装harbor时还是提示docker-compose未安装或者Permission denied的解决方案

    安装Harbor时,下载安装了docker-compose并赋予权限 sudo curl -L "https://github.com/docker/compose/releases/dow ...

  10. Android Studio 下载jcenter依赖失败问题及解决

    优先国内的镜像下载即可 我用的华为和阿里云的国内镜像 google() maven { url 'https://jitpack.io' } maven { url 'http://maven.ali ...