日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

基于 EntityFramework 生成 Repository 模式代码

發(fā)布時間:2023/12/4 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 基于 EntityFramework 生成 Repository 模式代码 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

借助?WeihanLi.EntityFramework?實現(xiàn)簡單的 Repository

Intro

很多時候一些簡單的業(yè)務(wù)都是簡單的增刪改查,動態(tài)生成一些代碼完成基本的增刪改查,而這些增刪改查代碼大多類似,只有一些有復(fù)雜業(yè)務(wù)邏輯的可能需要手動去寫。于是實現(xiàn)了一個基于 EF Core 的 Repository。

GetStarted

0. 添加包引用

在項目里增加對 WeihanLi.EntityFramework 的引用

dotnet add package WeihanLi.EntityFramework

來看個使用例子:

使用方式:

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

  • // 注冊 EFREpository

  • services.AddEFRepostory();


  • // 在需要的地方使用,直接獲取一個 `IEFRepository<TestDbContext, TestEntity>` 服務(wù)

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

  • {

  • repo.Update(new TestEntity

  • {

  • CreatedAt = DateTime.UtcNow,

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

  • Id = 3

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

  • repo.Insert(new[]

  • {

  • new TestEntity

  • {

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

  • CreatedAt = DateTime.Now

  • },

  • new TestEntity

  • {

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

  • CreatedAt = DateTime.Now

  • }

  • });

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

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


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

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


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

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


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

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

  • );


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

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

  • });

  • 2. 生成自己的 Repository 代碼

    你可以生成自己的 基于 默認的 Repository 的代碼,默認的 Repository 的所有方法都是虛方法,可以重寫也可以,默認會生成接口和類,如果不要生成接口可以配置 EFRepositoryGeneratorOptions

  • // 配置不生成接口

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


  • // 配置生成的 Repository 類型名稱, 默認是 EntityName+"Repository",可以通過 RepositoryNameResolver 自定義

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

  • 默認生成的代碼類似于這樣子:

  • using WeihanLi.EntityFramework;

  • using WeihanLi.EntityFramework.Samples;


  • namespace WeihanLi.EntityFramework.Samples.Business

  • {


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

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

  • {

  • public TestEntityRepository(TestDbContext dbContext) : base(dbContext) { }

  • }

  • }

  • 如果對生成的代碼內(nèi)容部分要修改,可以自定義自己的 IEFRepositoryGenerator,然后 services.AddSingleton<IEFRepositoryGenerator,CustomEFRepositoryGenerator>() 覆蓋掉默認的就可以了,或者可以 Replace 直接替換也是可以的~

    調(diào)用下面的代碼去生成代碼:

  • DependencyResolver.Current.ResolveService<IEFRepositoryGenerator>()

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

  • QueryBuilder 使用

    為 EF 添加了 FluentAPI 的 QueryBuilder 支持,使得可以更方便的進行數(shù)據(jù)查詢。

    默認的 QueryBuilder 會 AsNoTracking(),如果不要 AsNoTracking可以使用 WithNoTracking(false) 來設(shè)置,EFCore 新增了一個 QueryFilter 可以全局過濾,默認查詢也是啟動全局過濾的,如果要在查詢中禁用這個全局過濾可以通過 IgnoreQueryFilters() 來設(shè)置。

    基本方法:

  • EFRepositoryQueryBuilder<TEntity> WithPredict(Expression<Func<TEntity, bool>> predict);// 設(shè)置查詢條件

  • EFRepositoryQueryBuilder<TEntity> WithOrderBy(Func<IQueryable<TEntity>, IOrderedQueryable<TEntity>> orderByExpression); // 設(shè)置排序

  • EFRepositoryQueryBuilder<TEntity> WithNoTracking(bool noTracking = true); // 設(shè)置是否 Tracking

  • EFRepositoryQueryBuilder<TEntity> IgnoreQueryFilters(bool ignoreQueryFilters = true);// 是否忽略查詢

  • EFRepositoryQueryBuilder<TEntity> WithInclude(Func<IQueryable<TEntity>, IIncludableQueryable<TEntity, object>> include); // 設(shè)置 include

  • EFRepositoryQueryBuilder<TEntity> WithCount(int count);// 如果要查 Top N 的時候可以設(shè)置

  • 使用示例如下:

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


  • // query lastItem

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

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


  • // query id list orderBy id desending

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

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

  • );


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

  • .WithPredict(whereLambda)

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

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


  • //load data

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

  • .WithPredict(whereLambda)

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

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

  • , 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社區(qū)新聞,深度好文,歡迎訪問公眾號文章匯總?http://www.csharpkit.com?



    總結(jié)

    以上是生活随笔為你收集整理的基于 EntityFramework 生成 Repository 模式代码的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。