写点什么

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

作者:EquatorCoco
  • 2024-04-08
    福建
  • 本文字数:2342 字

    阅读完需:约 8 分钟

前言


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(); } }
复制代码


文章转载自:追逐时光者

原文链接:https://www.cnblogs.com/Can-daydayup/p/18120034

体验地址:http://www.jnpfsoft.com/?from=001

用户头像

EquatorCoco

关注

还未添加个人签名 2023-06-19 加入

还未添加个人简介

评论

发布
暂无评论
一个库帮你快速实现EF Core数据仓储模式_Java_EquatorCoco_InfoQ写作社区