一个库帮你快速实现EF Core数据仓储模式

简介: 一个库帮你快速实现EF Core数据仓储模式

前言

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推荐或自荐(让优秀的项目和框架不被埋没🤞)。

相关文章
|
供应链 JavaScript 安全
SBOM概念和Java生成方式
SBOM概念和Java生成方式
|
机器学习/深度学习 编解码 算法
图像超分:RFB-ESRGAN(Perceptual Extreme Super Resolution Network with Receptive Field Block)
图像超分:RFB-ESRGAN(Perceptual Extreme Super Resolution Network with Receptive Field Block)
484 0
|
5月前
|
监控 Cloud Native 测试技术
.NET技术深度解析:现代企业级开发指南
每日激励:“不要一直责怪过去的自己,他曾经站在雾里也很迷茫”。我是蒋星熠Jaxonic,一名在代码宇宙中探索的极客旅人。从.NET Framework到.NET 8,我深耕跨平台、高性能、云原生开发,践行领域驱动设计与微服务架构,用代码书写技术诗篇。分享架构演进、性能优化与AI融合前沿,助力开发者在二进制星河中逐光前行。关注我,共探技术无限可能!
.NET技术深度解析:现代企业级开发指南
|
开发框架 前端开发 JavaScript
基于SqlSugar的开发框架循序渐进介绍(31)-- 在查询接口中实现多表联合和单表对象的统一处理
基于SqlSugar的开发框架循序渐进介绍(31)-- 在查询接口中实现多表联合和单表对象的统一处理
|
SQL 关系型数据库 数据库连接
详解 Entity Framework(EF)核心组件与数据访问方法探索
Entity Framework是一个ORM框架,简化.NET开发者与数据库的交互。它始于.NET Framework的一部分,但现在可通过NuGet独立获取。ORM允许对象模型直接映射到数据库结构,避免直接编写SQL。
2327 2
详解 Entity Framework(EF)核心组件与数据访问方法探索
|
API 数据库 开发者
掌握数据完整性的关键:全面解析Entity Framework Core中的事务管理策略及其应用
【8月更文挑战第31天】在数据库操作中,确保数据完整性至关重要。Entity Framework Core(EF Core)作为一款强大的ORM工具,提供了丰富的API支持事务管理,帮助开发者实现数据的一致性和完整性。
248 0
|
存储 API 数据库
深入探索DDD与事件溯源:使用Entity Framework Core构建高效且可维护的领域驱动设计应用——从理论到实践的全方位指南,附带代码示例与最佳实践分享
【8月更文挑战第31天】本文通过实例介绍如何结合领域驱动设计(DDD)与事件溯源(Event Sourcing)及 Entity Framework Core(EF Core),构建高效且可维护的应用程序。DDD 强调业务逻辑与软件设计的紧密融合,而事件溯源则通过记录所有变更事件来重建状态。文章详细展示了创建基于 EF Core 的项目、配置数据库上下文、定义领域模型与事件,并存储和提交事件的具体步骤。通过这些技术,实现了复杂业务逻辑的持久化与重构,提高了应用程序的灵活性和扩展性。
569 0
Element UI 表格【列宽自适应】
Element UI 表格【列宽自适应】
693 0
|
负载均衡 安全 网络协议
网关知识总结
网关知识总结
8320 0
Vue3 封装 element-plus 图标选择器
Vue3 封装 element-plus 图标选择器
866 0

热门文章

最新文章