基于 EntityFramework 生成 Repository 模式代码

借助 WeihanLi.EntityFramework 实现简单的 Repository

Intro

很多时候一些简单的业务都是简单的增删改查,动态生成一些代码完成基本的增删改查,而这些增删改查代码大多类似,只有一些有复杂业务逻辑的可能需要手动去写。于是实现了一个基于 EF Core 的 Repository。

GetStarted

0. 添加包引用

在项目里增加对 WeihanLi.EntityFramework 的引用

dotnet add package WeihanLi.EntityFramework

来看个使用例子:

使用方式:

1. 不需要定义自己的Repository,默认使用泛型的Repository

  1. // 注册 EFREpository

  2. services.AddEFRepostory();


  3. // 在需要的地方使用,直接获取一个 `IEFRepository<TestDbContext, TestEntity>` 服务

  4. DependencyResolver.Current.TryInvokeService<IEFRepository<TestDbContext, TestEntity>>(repo =>

  5. {

  6. repo.Update(new TestEntity

  7. {

  8. CreatedAt = DateTime.UtcNow,

  9. Extra = new { Name = "Abcde", Count = 4 }.ToJson(),

  10. Id = 3

  11. }, t => t.CreatedAt, t => t.Extra);

  12. repo.Insert(new[]

  13. {

  14. new TestEntity

  15. {

  16. Extra = new {Name = "Abcdes"}.ToJson(),

  17. CreatedAt = DateTime.Now

  18. },

  19. new TestEntity

  20. {

  21. Extra = new {Name = "Abcdes"}.ToJson(),

  22. CreatedAt = DateTime.Now

  23. }

  24. });

  25. var list = repo.GetAll().Select(_ => _.Id).ToArray();

  26. Console.WriteLine($"Ids: {list.StringJoin(",")}");


  27. repo.Get(_ => _.Id, queryBuilder => queryBuilder

  28. .WithOrderBy(q => q.OrderByDescending(_ => _.Id)));


  29. var lastItem = repo.FirstOrDefault(queryBuilder => queryBuilder

  30. .WithOrderBy(q => q.OrderByDescending(_ => _.Id)));


  31. var list1 = repo.Get(x => x.Id, queryBuilder => queryBuilder

  32. .WithOrderBy(query => query.OrderByDescending(q => q.Id))

  33. );


  34. repo.Delete(t => DbFunctions.JsonValue(t.Extra, "$.Name") == "Abcdes");

  35. Console.WriteLine($"Count: {repo.Count()}");

  36. });

2. 生成自己的 Repository 代码

你可以生成自己的 基于 默认的 Repository 的代码,默认的 Repository 的所有方法都是虚方法,可以重写也可以,默认会生成接口和类,如果不要生成接口可以配置 EFRepositoryGeneratorOptions

  1. // 配置不生成接口

  2. services.Configure<EFRepositoryGeneratorOptions>(options=>options.GenerateInterface=false);


  3. // 配置生成的 Repository 类型名称, 默认是 EntityName+"Repository",可以通过 RepositoryNameResolver 自定义

  4. services.Configure<EFRepositoryGeneratorOptions>(options=>options.RepositoryNameResolver = entityName=> $"{entityName}Service");

默认生成的代码类似于这样子:

  1. using WeihanLi.EntityFramework;

  2. using WeihanLi.EntityFramework.Samples;


  3. namespace WeihanLi.EntityFramework.Samples.Business

  4. {


  5. public partial interface ITestEntityRepository : IEFRepository<TestDbContext, TestEntity> { }

  6. public partial class TestEntityRepository : EFRepository<TestDbContext, TestEntity>, ITestEntityRepository

  7. {

  8. public TestEntityRepository(TestDbContext dbContext) : base(dbContext) { }

  9. }

  10. }

如果对生成的代码内容部分要修改,可以自定义自己的 IEFRepositoryGenerator,然后 services.AddSingleton<IEFRepositoryGenerator,CustomEFRepositoryGenerator>() 覆盖掉默认的就可以了,或者可以 Replace 直接替换也是可以的~

调用下面的代码去生成代码:

  1. DependencyResolver.Current.ResolveService<IEFRepositoryGenerator>()

  2. .GenerateRepositoryCodeFor<TestDbContext>("WeihanLi.EntityFramework.Samples.Business");

QueryBuilder 使用

为 EF 添加了 FluentAPI 的 QueryBuilder 支持,使得可以更方便的进行数据查询。

默认的 QueryBuilder 会 AsNoTracking(),如果不要 AsNoTracking可以使用 WithNoTracking(false) 来设置,EFCore 新增了一个 QueryFilter 可以全局过滤,默认查询也是启动全局过滤的,如果要在查询中禁用这个全局过滤可以通过 IgnoreQueryFilters() 来设置。

基本方法:

  1. EFRepositoryQueryBuilder<TEntity> WithPredict(Expression<Func<TEntity, bool>> predict);// 设置查询条件

  2. EFRepositoryQueryBuilder<TEntity> WithOrderBy(Func<IQueryable<TEntity>, IOrderedQueryable<TEntity>> orderByExpression); // 设置排序

  3. EFRepositoryQueryBuilder<TEntity> WithNoTracking(bool noTracking = true); // 设置是否 Tracking

  4. EFRepositoryQueryBuilder<TEntity> IgnoreQueryFilters(bool ignoreQueryFilters = true);// 是否忽略查询

  5. EFRepositoryQueryBuilder<TEntity> WithInclude(Func<IQueryable<TEntity>, IIncludableQueryable<TEntity, object>> include); // 设置 include

  6. EFRepositoryQueryBuilder<TEntity> WithCount(int count);// 如果要查 Top N 的时候可以设置

使用示例如下:

  1. var repository = serviceProvider.GetService<IEFRepository<TestDbContext, TestEntity>>();


  2. // query lastItem

  3. var lastItem = repo.FirstOrDefault(queryBuilder => queryBuilder

  4. .WithOrderBy(q => q.OrderByDescending(_ => _.Id)));


  5. // query id list orderBy id desending

  6. var idList = repo.Get(x => x.Id, queryBuilder => queryBuilder

  7. .WithOrderBy(query => query.OrderByDescending(q => q.Id))

  8. );


  9. var blockList = serviceProvider.GetService<IEFRepository<TestDbContext, BlockEntity>>().GetPagedList(queryBuilder => queryBuilder

  10. .WithPredict(whereLambda)

  11. .WithInclude(q => q.Include(b => b.BlockType))

  12. .WithOrderBy(q => q.OrderByDescending(b => b.BlockTime)), search.PageIndex, search.PageSize);


  13. //load data

  14. var list = _reservationBLL.GetPagedList(queryBuilder => queryBuilder

  15. .WithPredict(whereLambda)

  16. .WithOrderBy(query => query.OrderByDescending(r => r.ReservationForDate).ThenByDescending(r => r.ReservationTime))

  17. .WithInclude(query => query.Include(r => r.Place))

  18. , search.PageIndex, search.PageSize);

Reference

  • https://github.com/WeihanLi/ActivityReservation/blob/dev/ActivityReservation/Controllers/HomeController.cs#L43

  • https://github.com/WeihanLi/ActivityReservation/blob/dev/ActivityReservation.AdminLogic/Controllers/BlockEntityController.cs#L39

  • https://github.com/WeihanLi/WeihanLi.EntityFramework/blob/dev/samples/WeihanLi.EntityFramework.Samples/Program.cs


.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com 
640?wx_fmt=jpeg



本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/315495.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Codeforces Round #601 (Div. 2)

传送门 文章目录A.Changing Volume题意&#xff1a;思路&#xff1a;B. Fridge Lockers题意&#xff1a;思路&#xff1a;C. League of Leesins题意&#xff1a;思路&#xff1a;D. Feeding Chicken题意&#xff1a;思路&#xff1a;E1 E2. Send Boxes to AliceA.Changing Volu…

CF1375G. Tree Modification(贪心,黑白染色)

CF1375G. Tree Modification Solution 假设我们取定了根&#xff0c;那么只可能从深度大的点接到深度小的点&#xff0c;我们每次取一个高度为2的子树接到该子树的父亲&#xff0c;这样取一定不劣&#xff0c;操作次数相当于是偶数深度点&#xff08;根深度为0&#xff09;的…

P3168 [CQOI2015]任务查询系统 主席树 + 差分

传送门 题意&#xff1a; 思路&#xff1a; 题目中(si,ei,pi)(s_i,e_i,p_i)(si​,ei​,pi​)转换成操作即为在[si,ei][s_i,e_i][si​,ei​]区间内加上pip_ipi​的优先级&#xff0c;让后查询的话就是查询第xix_ixi​秒优先级最小的kik_iki​个任务的优先级之和。可知这两个操…

asp.net core 系列之Performance的 Response compression(响应压缩)

本文&#xff0c;帮助了解响应压缩的一些知识及用法(大部分翻译于官网,英文水平有限,不准确之处,欢迎指正)。什么是响应压缩&#xff1f;响应压缩简单的说就是为了减少网络带宽&#xff0c;而把返回的响应压缩&#xff0c;使之体积缩小&#xff0c;从而加快响应的一种技术(个人…

CF1516E. Baby Ehab Plays with Permutations(组合数学)

CF1516E. Baby Ehab Plays with Permutations Solution 因为组合水平不行所以只弄出来一个O(k4)O(k^4)O(k4)的做法&#xff08;虽然随便改改可能就O(k3log⁡k)O(k^3\log k)O(k3logk)或者O(k3)O(k^3)O(k3)了&#xff09;而且因为没想清楚而自闭了很久&#xff0c;从而导致摸yu…

Codeforces Round #603 (Div. 2) E. Editor 线段树维护括号序列

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 思路&#xff1a; 首先一个括号序列合法的条件可以转化成两个(左括号代价为111&#xff0c;右括号代价为−1-1−1)&#xff1a; (1) 左括号个数等于右括号个数。 (2) 括号的前缀和非负。 所以我们直接用线段…

从ASP.NET Core 3.0 preview 特性,了解CLR的Garbage Collection

前言在阅读这篇文章&#xff1a;Announcing Net Core 3 Preview3的时候&#xff0c;我看到了这样一个特性&#xff1a;Docker and cgroup memory LimitsWe concluded that the primary fix is to set a GC heap maximum significantly lower than the overall memory limit as …

CF1386C. Joker(整体二分)

CF1386C. Joker Solution 难得有一道可以整体二分的题。 有一个基本的思路是&#xff1a;考虑求出AnsiAns_iAnsi​表示最小的右端点&#xff0c;满足[1,i]∪[Ansi,m][1,i]\cup[Ans_i,m][1,i]∪[Ansi​,m]中存在奇环。 考虑到AnsiAns_iAnsi​序列是非减的&#xff0c;因此我…

asp.net core使用serilog将日志推送到腾讯云日志服务

为什么是serilog&#xff1f;Serilog是 .NET 中最著名的结构化日志类库。基于日志事件log events&#xff0c;而不是日志消息log message。你可以将日志事件格式化为控制台的可读文本或者可以将相同的事件格式化为JSON并将其发送到远程日志服务器。应用程序中的日志语句会创建L…

P5787 二分图 /【模板】线段树分治

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 思路&#xff1a; 线段树分治就是在线段树上进行遍历&#xff0c;到每个点都加上它对子节点的贡献&#xff0c;最后到叶子节点的时候算一下贡献。 对于这个题先考虑维护二分图的话&#xff0c;可以用扩展域并…

CF1413F. Roads and Ramen(树的直径,线段树)

CF1413F. Roads and Ramen Solution 感觉这个套路也见过许多次了&#xff1f;大概这种奇奇怪怪的树上最长路径的题都得往直径靠一靠。 大概有个结论是&#xff1a;存在一个最优路径使得其起始点和直径起始点有交。 然后我们只需要求出一个直径的起始点A,BA,BA,B&#xff0c…

微软发布 VS Code Java 安装程序,一键安装所有 Java 开发环境

北京时间 2019 年 6 月 14 日 &#xff0c;微软发布了 VS Code Java 安装程序&#xff0c;方便开发者能一键安装所有 Java 开发环境。几乎是在三年前&#xff0c;在微软苏黎世办公室的编程马拉松中&#xff0c;来自 Red Hat&#xff0c;IBM&#xff0c;Codenvy 和 Microsoft 的…

CF1361C. Johnny and Megan‘s Necklace(构造,欧拉回路,传递闭包)

CF1361C. Johnny and Megan’s Necklace Solution 真duliu&#xff0c;快做吐了。。。 刚开始想了一个假做法&#xff08;但前面还是很真的&#xff09;。 假的做法大概是你发现这个东西具有传递性&#xff0c;因此你考虑把aia_iai​翻转后在后面补0直到20位之后&#xff0…

Codeforces Round #601 (Div. 2) E2. Send Boxes to Alice (Hard Version) 思维 + 质因子

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 大体题意跟easyeasyeasy版本差不多&#xff0c;就是hardhardhard版本的aaa范围更大。见这里Codeforces Round #601 (Div. 2) 思路&#xff1a; 首先还是考虑质因子分解&#xff0c;因为一个数被分成以xyxy…

[译]C#中的条件断点

这只是你们许多人中可能使用的一个简单技巧。这是一个小但非常强大的技巧&#xff0c;在你调试大型代码库时尤其有用。这是条件断点的概念。正如名称本身所暗示的那样&#xff0c;只有在满足某个条件时才会设置被击中的断点。它也很容易实现。创建一个新的应用程序并设置一个普…

CF1090F - How to Learn You Score(构造)

CF1090F - How to Learn You Score Solution 很不戳的构造题。 首先观察数据范围&#xff1a;n∈[5,1000]n\in[5,1000]n∈[5,1000]&#xff0c;这启发我们什么&#xff1f;n5n5n5的时候解是唯一的&#xff0c;因此我们可以把nnn切成若干段长度为555的段&#xff0c;每一段分…

前菜---二叉树+堆的小练习

目录 前言&#x1f3dc;️ 1. 二叉树性质总结⛱️ 1.2 性质3⏰ 2. 二叉树性质小练习&#x1f3d5;️ 3. 答案解析&#x1f4a1; 4. 堆概念结构小练习&#x1fa94; 5. 答案解析&#x1f9ff; 6. 前/中/后/层序遍历小练习&#x1f52b; 7. 答案解析&#x1f9fa; 后语…

牛客 CCA的区间 dp + 补集转移

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 思路&#xff1a; 首先翻转一个区间意味着可以将任意两段不相交的区间组合&#xff0c;所以问题变成了选两端不相交的区间&#xff0c;使得合并后区间和最大。那么我们就处理出来区间&#xff0c;让后进行转…

ASP.NET Core IP 请求频率限制

在网站或API应用中&#xff0c;我们为了防止无聊人士或恶意攻击&#xff0c;通常希望屏蔽某一IP短时间的内高频率请求。在ASP.NET Core中&#xff0c;限制IP请求频率非常简单&#xff0c;我们来看看吧。轮子一个.NET Core 目前的生态发展十分迅猛&#xff0c;轮子也越来越多。只…

2019 秦皇岛 I - Invoker Gym - 102361I dp

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 累了&#xff0c;略。 思路&#xff1a; 将这101010个串打乱顺序&#xff0c;每个串最多有666种情况&#xff0c;全部写出来&#xff0c;让后连边。最后直接在转移的时候分别从上一个字符的666个状态转移就…