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

本文介绍了如何在.NETCore项目中利用EFCoreGenericRepository库快速建立通用仓储层,提供数据库事务支持、延迟查询、原生SQL等特性,提升开发效率和代码可维护性。
摘要由CSDN通过智能技术生成

22b571c092c164ebbb06b0699db67695.png

ebd0b495058c5c19b667240b08a05572.jpeg

前言

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查询支持复杂类型和原始类型。

项目源代码

d5a5d09e5f051c88f27415eb2363e132.png 91595ab5e61eb563c6a408b4f5bee2e6.png

新建控制台应用

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

7a8f4dfeae026de4c34fcf1c49b86afe.png efad9dec4402540122029a1520b8bf63.png 28d1ee5d228147f501997d3dc83f8d1f.png

相关类库安装

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

ea73665f172c24359aeebc7c6611ef02.png

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

6e52f4004e4cc834f535766f87bd1729.png

新建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支持💖。

  • GitHub源码:https://github.com/TanvirArjel/EFCore.GenericRepository

  • 文章示例源码:https://github.com/YSGStudyHards/DotNetExercises/tree/master/GenericRepositoryExercise

优秀项目和框架精选

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

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

faea32f5a836b4dfea297a5e35274b00.gif

d78818cc98d6cbaf4abeec9812c33fe9.gif

feef42c8372cc2368a666dc6c303309d.jpeg


学习是一个永无止境的过程,你知道的越多,你不知道的也会越多,在有限的时间内坚持每天多学一点,你一定能成为你想要成为的那个人。不积跬步无以至千里,不积小流无以成江河!!!

b24fec55bdb6714965ba39bd6f1d9c9b.gif

See you next good day

5f02f6845cb8b51eecc60fedef5e05a8.gif

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值