一个库帮你快速实现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 ...
随机推荐
- 【LeetCode二叉树#10】从中序与后序(或者前序)遍历序列构造二叉树(首次构造二叉树)
从中序与后序遍历序列构造二叉树 力扣题目链接(opens new window) 根据一棵树的中序遍历与后序遍历构造二叉树. 注意: 你可以假设树中没有重复的元素. 例如,给出 中序遍历 inorde ...
- 【算法day1】复杂度和简单排序算法(1)
复杂度和简单排序算法 时间复杂度 以一个排序(选择排序)操作举例 假设我有一个数组,我要找出其中的最小值放到0的位置上 那么 第一次我会遍历数组中N个数(在0位置处),找出最小的数交换到0位置[看了( ...
- 在Windows环境中配置使用我们搭建的DNS服务器
1.修改网卡的设置,首选DNS用我们自己的 2.在命令行中测试 专业的nslookup 3.已知的问题 每次在DNS服务器的web界面中,修改了解析,必须用docker restart dns命令,把 ...
- 【Azure Function】修改Function执行的Timeout时间
问题描述 Azure Function默认的Timeout时间是否可以调整呢? 问题解答 可以的,根据创建Function的时候选择的定价层不同,Function 默认的Timeout时间也不同. 消 ...
- [Python] 子线程退出孙线程不退出
遇到了一个大坑! 如图,在子线程ThreadFunc退出之后,ThreadFunc2依旧在运行... 根本不会结束 但是官方文档中说明了,只要设置了daemon不为None 就能设置子线程是守护线程, ...
- Java interface 接口 新特性
1 package com.bytezreo.interfacetest; 2 3 public class SubClass2 { 4 public static void main(String[ ...
- springMvc精简整理
精简共分步 新建一个web工程 导入核心就二包,因为springmvc 包自己有依赖 <?xml version="1.0" encoding="UTF-8&qu ...
- Spring整合mybatis使用xml配置事务
自己准备开始教授Java相关的技术,Spring框架是必须让学生学习的框架之一.里面有一个事务相关的 配置,以前刚学习Spring框架的时候有接触过,只是过了很多年,很多东西都已经淡忘.再来回忆一下 ...
- 已安装docker-compose,安装harbor时还是提示docker-compose未安装或者Permission denied的解决方案
安装Harbor时,下载安装了docker-compose并赋予权限 sudo curl -L "https://github.com/docker/compose/releases/dow ...
- Android Studio 下载jcenter依赖失败问题及解决
优先国内的镜像下载即可 我用的华为和阿里云的国内镜像 google() maven { url 'https://jitpack.io' } maven { url 'http://maven.ali ...