大连网站建设动态,精美网站开发方案,天天新网站,洛阳网站建设价格低借助 WeihanLi.EntityFramework 实现简单的 RepositoryIntro很多时候一些简单的业务都是简单的增删改查#xff0c;动态生成一些代码完成基本的增删改查#xff0c;而这些增删改查代码大多类似#xff0c;只有一些有复杂业务逻辑的可能需要手动去写。于是实现了一个基于 EF … 借助 WeihanLi.EntityFramework 实现简单的 RepositoryIntro很多时候一些简单的业务都是简单的增删改查动态生成一些代码完成基本的增删改查而这些增删改查代码大多类似只有一些有复杂业务逻辑的可能需要手动去写。于是实现了一个基于 EF Core 的 Repository。GetStarted0. 添加包引用在项目里增加对 WeihanLi.EntityFramework 的引用dotnet add package WeihanLi.EntityFramework来看个使用例子使用方式1. 不需要定义自己的Repository默认使用泛型的Repository// 注册 EFREpositoryservices.AddEFRepostory();// 在需要的地方使用直接获取一个 IEFRepositoryTestDbContext, TestEntity 服务DependencyResolver.Current.TryInvokeServiceIEFRepositoryTestDbContext, 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.ConfigureEFRepositoryGeneratorOptions(optionsoptions.GenerateInterfacefalse);// 配置生成的 Repository 类型名称 默认是 EntityNameRepository可以通过 RepositoryNameResolver 自定义services.ConfigureEFRepositoryGeneratorOptions(optionsoptions.RepositoryNameResolver entityName ${entityName}Service);默认生成的代码类似于这样子using WeihanLi.EntityFramework;using WeihanLi.EntityFramework.Samples;namespace WeihanLi.EntityFramework.Samples.Business{ public partial interface ITestEntityRepository : IEFRepositoryTestDbContext, TestEntity { } public partial class TestEntityRepository : EFRepositoryTestDbContext, TestEntity, ITestEntityRepository { public TestEntityRepository(TestDbContext dbContext) : base(dbContext) { } }}如果对生成的代码内容部分要修改可以自定义自己的 IEFRepositoryGenerator然后 services.AddSingletonIEFRepositoryGenerator,CustomEFRepositoryGenerator() 覆盖掉默认的就可以了或者可以 Replace 直接替换也是可以的~调用下面的代码去生成代码DependencyResolver.Current.ResolveServiceIEFRepositoryGenerator() .GenerateRepositoryCodeForTestDbContext(WeihanLi.EntityFramework.Samples.Business);QueryBuilder 使用为 EF 添加了 FluentAPI 的 QueryBuilder 支持使得可以更方便的进行数据查询。默认的 QueryBuilder 会 AsNoTracking()如果不要 AsNoTracking可以使用 WithNoTracking(false) 来设置EFCore 新增了一个 QueryFilter 可以全局过滤默认查询也是启动全局过滤的如果要在查询中禁用这个全局过滤可以通过 IgnoreQueryFilters() 来设置。基本方法EFRepositoryQueryBuilderTEntity WithPredict(ExpressionFuncTEntity, bool predict);// 设置查询条件EFRepositoryQueryBuilderTEntity WithOrderBy(FuncIQueryableTEntity, IOrderedQueryableTEntity orderByExpression); // 设置排序EFRepositoryQueryBuilderTEntity WithNoTracking(bool noTracking true); // 设置是否 TrackingEFRepositoryQueryBuilderTEntity IgnoreQueryFilters(bool ignoreQueryFilters true);// 是否忽略查询EFRepositoryQueryBuilderTEntity WithInclude(FuncIQueryableTEntity, IIncludableQueryableTEntity, object include); // 设置 includeEFRepositoryQueryBuilderTEntity WithCount(int count);// 如果要查 Top N 的时候可以设置使用示例如下var repository serviceProvider.GetServiceIEFRepositoryTestDbContext, TestEntity();// query lastItemvar lastItem repo.FirstOrDefault(queryBuilder queryBuilder .WithOrderBy(q q.OrderByDescending(_ _.Id))); // query id list orderBy id desendingvar idList repo.Get(x x.Id, queryBuilder queryBuilder .WithOrderBy(query query.OrderByDescending(q q.Id)) );var blockList serviceProvider.GetServiceIEFRepositoryTestDbContext, 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 datavar 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);Referencehttps://github.com/WeihanLi/ActivityReservation/blob/dev/ActivityReservation/Controllers/HomeController.cs#L43https://github.com/WeihanLi/ActivityReservation/blob/dev/ActivityReservation.AdminLogic/Controllers/BlockEntityController.cs#L39https://github.com/WeihanLi/WeihanLi.EntityFramework/blob/dev/samples/WeihanLi.EntityFramework.Samples/Program.cs.NET社区新闻深度好文欢迎访问公众号文章汇总 http://www.csharpkit.com