手机版

基于实体框架定制分页效果

时间:2021-09-04 来源:互联网 编辑:宝哥软件园 浏览:

简介

我之前写了一个基于Dapper的分页实现,现在我将写一个基于Entity Framework的分页实现,以及一个添加、删除和修改的通用实现。

密码

还是代码优先:https://github.com/jinweijie/EF.通用信息库

如何运行示例

或者像以前一样:

1.首先克隆代码,然后在数据库中解压Database.7z

2.附加到Sql服务器本地数据库。如果您没有使用Sql Server的本地数据库,则需要在应用程序中更改连接字符串。配置

3.ctrl+F5运行示例程序。

存储库基类-查询

Common\AbstractRepository.cs是Repository的基类,它实现了一些添加、删除和修改查询的方法,例如:

public virtupleenumeblet,int Find(ExpressionFuncT,bool criteria,int pageIndex,int pageSize,string[] asc,string[] desc,Params expression funct,object [] include properties)该方法是AbstractRepository查询方法之一,用于自定义分页查询,其中criteria是作为查询条件的表达式,参数pageIndex,pageSize,asc,desc是分页相关参数;

关于多个表(相关表):

IncludeProperties是在有多个表时连接关联的表。因为EF默认是Lazy Loading,关联的表默认不会立即加载,所以有时候写代码不小心,可能会在for循环中循环查询N个word表。用于includeProperties参数,查询时可以连接关联表。

存储库基类-添加、删除和修改

抽象存储库已经实现了用泛型添加、删除和修改的方法:

公共虚拟T创建(T实体)公共虚拟T更新(T实体)公共虚拟T创建或更新(T实体)公共虚拟无效删除(TId id)

此外,关于事务的实现,我使用工作单元模式,多个存储库共享一个数据库上下文。请在工作单位中找到UOW。

当调用UOW时,基本上类似于这样:

var uow=new eFunitofWork();var repo=uow。GetLogRepository();回购。创建(新日志{级别Id=1,线程=' ',位置='手动创建',消息='这是手动创建的日志',CreateTime=DateTimeOffset。现在,日期=日期时间。now });uow。commit();从UnitOfWork获取一个或多个存储库,共享数据库上下文,添加、删除和更改,最后统一保存更改。

存储库的派生类

由于AbstractRepository已经存在,所以实现了许多添加、删除和修改查询的方法,因此派生类,比如示例项目中的LogRepository,基本上可以变得非常简单,主要实现一些特定的业务逻辑。在示例项目中,因为没有特殊的业务逻辑,所以会非常简单:

公共类日志存储库:抽象存储库日志,int {公共日志存储库(ef上下文上下文): base(上下文){}}关于实体的生成

我更喜欢数据库的实现首先,先设计数据库,然后使用edmx逆向工程生成POCO。您可以参考实体目录中的相关文件。

当然,如果你喜欢Code First,也没有问题,本文的实现仍然适用。

使用日志记录跟踪EF SQL

使用Entity Framework时,最好关注EF生成的SQL,这样可以在开发阶段发现一些潜在的性能问题,避免生产环境。)

Common\EFContext.cs中有一个配置项EnableTraceSql,如果为真,EF生成的Sql将被nlog记录。我将nlog的日志配置到数据库中。也就是说,当您运行示例项目时,每次查询时,都会添加一个新的日志记录,内容将是查询过程中生成的SQL:

规格模式

在查询方法中,有一个接受ISpecification示例的重载。这种实现可以有效地控制业务逻辑。对于编写为由其他人调用的接口,可以清楚地确定查询参数,例如:

公共类logsearchespecification : is specification log {公共字符串LevelName { get设置;}公共字符串Message { get设置;} public ExpressionFuncLog,bool to expression(){ return log=(log。级别。名称==级别名称||级别名称==' ')(日志。消息。包含(消息)||消息==' ');} public bool issatifiedby(Log实体){ return(实体。级别。名称==级别名称||级别名称==' ')(实体。消息。包含(消息)||消息==' ');}}然后,调用这个查询方法的代码可以很清楚的知道我的查询条件是LevelName和Message,并且LevelName相等,Message为Like是在LogSearchSpeficiation中实现的,封装的很好。

最后

这套实现是这几年慢慢积累起来的,已经实践过了,应该作为一定的参考。当然,在具体的项目中,可以使用一些DI来获取Repository等等,这已经超出了本文的范围。大家可以自由发挥,希望对大家有帮助。谢谢你。

版权声明:基于实体框架定制分页效果是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。