一个库帮你快速实现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支持。
- 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
DotNetGuide技术社区交流群
- DotNetGuide技术社区是一个面向.NET开发者的开源技术社区,旨在为开发者们提供全面的C#/.NET/.NET Core相关学习资料、技术分享和咨询、项目框架推荐、求职和招聘资讯、以及解决问题的平台。
- 在DotNetGuide技术社区中,开发者们可以分享自己的技术文章、项目经验、学习心得、遇到的疑难技术问题以及解决方案,并且还有机会结识志同道合的开发者。
- 我们致力于构建一个积极向上、和谐友善的.NET技术交流平台。无论您是初学者还是有丰富经验的开发者,我们都希望能为您提供更多的价值和成长机会。
一个库帮你快速实现EF Core数据仓储模式的更多相关文章
- EF Core 快速上手——EF Core 入门
EF Core 快速上手--EF Core 介绍 本章导航 从本书你能学到什么 对EF6.x 程序员的一些话 EF Core 概述 1.3.1 ORM框架的缺点 第一个EF Core应用 本文是对 ...
- EF Core 快速上手——EF Core的三种主要关系类型
系列文章 EF Core 快速上手--EF Core 入门 本节导航 三种数据库关系类型建模 Migration方式创建和习修改数据库 定义和创建应用DbContext 将复杂查询拆分为子查询 本 ...
- [EF Core]数据迁移(二)
摘要 在实际项目中,大多都需要对业务逻辑以及操作数据库的逻辑进行分成操作,这个时候该如何进行数据的迁移呢? 步骤 上篇文章:EF Core数据迁移操作 比如,我们将数据上下文放在了Data层. 看一下 ...
- EF Core 数据变更自动审计设计
EF Core 数据变更自动审计设计 Intro 有的时候我们需要知道每个数据表的变更记录以便做一些数据审计,数据恢复以及数据同步等之类的事情, EF 自带了对象追踪,使得我们可以很方便的做一些审计工 ...
- EF Core数据访问入门
重要概念 Entity Framework (EF) Core 是轻量化.可扩展.开源和跨平台的数据访问技术,它还是一 种对象关系映射器 (ORM),它使 .NET 开发人员能够使用面向对象的思想处理 ...
- EF Core数据迁移操作
摘要 在开发中,使用EF code first方式开发,那么如果涉及到数据表的变更,该如何做呢?当然如果是新项目,删除数据库,然后重新生成就行了,那么如果是线上的项目,数据库中已经有数据了,那么删除数 ...
- asp.net core 一个中小型项目实战的起手式——项目搭建与仓储模式下的持久层创建(1)
常规的中小型项目搭建方式一般是三层架构加上mvc与webapi作为一个主要框架,再加上一些第三方库,例如orm框架(EF.SqlSugar.Dapper等),API文档工具(Swagger)这些的应用 ...
- EF Core 数据过滤
1 前言 本文致力于将一种动态数据过滤的方案描述出来(基于 EF Core 官方的数据筛选器),实现自动注册,多个条件过滤,单条件禁用(实际上是参考ABP的源码),并尽量让代码保持 EF Core 的 ...
- ef core数据迁移的一点小感悟
ef core在针对mysql数据迁移的时候,有些时候没法迁移...有两种情况没法迁移,一种是因为efcore的bug问题导致没法迁移,这个在github上有个问题集,另外一种是对数据表进行较大幅度的 ...
- .Net Core3.1 + EF Core + LayUI 封装的MVC版后台管理系统
项目名称:学生信息管理系统1.0 后台框架:.Net Core 3.1 + EF Core yrjw.ORM.Chimp 前端框架:ASP.NET Core MVC + LayUI + Bo ...
随机推荐
- 如何在矩池云复现开源对话语言模型 ChatGLM
ChatGLM-6B 是一个开源的.支持中英双语的对话语言模型,基于 General Language Model (GLM) 架构,具有 62 亿参数.结合模型量化技术,用户可以在消费级的显卡上进行 ...
- RabbitMQ零碎整理,总有一天在你工作中会用到
概念 MQ:消息队列(消息中间件),开源的基于AMQP协议的消息中间件,异步 解耦 削峰 核心作用:1.异步 2.解耦 3.消息通信 RabbitMQ 消息的类型:1.点对点 2.Worker 3.发 ...
- go grpc流式和非流式的例子
参考grpc官方: https://grpc.io/docs/quickstart/go.html 或官方中文翻译: http://doc.oschina.net/grpc?t=60133 安装pr ...
- electron暴露配置文件(用户可随时修改)
配置文件 一般web前端项目配置文件,写死的放在src/config下,需要打包配置的放在.env文件中.但在electron项目中,如果配置数据更改,需要每次给用户打包升级肯定是行不通的.于是外部配 ...
- C 语言字符串操作总结
C 语言字符串操作总结 一.字符串操作 size_t 是一个无符号整型. 1.1 strcpy 函数原型:char *strcpy(char *dest, const char *src). 功 能: ...
- 摆脱鼠标系列 - vscode vim 插件 常用快捷键整理
列表 只总结当前用到的快捷键,并且对 ctrl+c v w 这三个快捷键还是用vscode,过渡下. 复制当前行 yy 复制当前单词 yaw 移动到下一个单词 w 下移10行 . 这个有不管用了,估计 ...
- 【LLM】在Colab上使用免费T4 GPU进行Chinese-Llama-2-7b-4bit推理
一.配置环境 1.打开colab,创建一个空白notebook,在[修改运行时环境]中选择15GB显存的T4 GPU. 2.pip安装依赖python包 !pip install --upgrade ...
- 泰凌微TLSR8258芯片解决方案开发之串口打印级别设置
一 TRSR8258简介 该芯片是泰凌微推出来的一款纯ble的芯片,接口丰富,功耗低,资源丰富,非常适合做可穿戴物联网设备,笔者拿这颗芯片做了不少方案,感觉非常好用,所以这里写一下使用心得. 二 串 ...
- Navicat 15下载教程
Navicat 15下载_永久激活注册码(附图文安装教程) 欢迎关注博主公众号「java大师」, 专注于分享Java领域干货文章, 关注回复「资源」, 免费领取全网最热的Java架构师学习PDF, 转 ...
- [置顶]
spring巧用继承解决bean的id相同的问题
先感叹一下:最近的项目真的很奇葩!!! 需求是这样的:我们的项目中引用了两个jar包,这两个jar包是其他项目组提供的,不能修改! 奇葩的是:这两个jar中都需要引用方提供一个相同id的bean,而b ...