实体框架自定义分页效果的实现方法?这个问题可能是我们日常学习或工作经常见到的。希望通过这个问题能让你收获颇深。下面是小编给大家带来的参考内容,让我们一起来看看吧!
<强>简介强>
之前写个一个基于衣冠楚楚的分页实现,现在再来写一个基于实体框架的分页实现,以及增删改的通用实现。
<强>代码
强>
还是先上代码:https://github.com/jinweijie/EF.GenericRepository
<>强如何运行示例
强>
还是像先前一样:
1。先复制下代码,在数据库里面解压缩Database.7z
2。连接到Sql Server LocalDB上。如果你用的不是Sql Server的LocalDB,你需要更改App.Config里的连接字符串。
3。Ctrl + F5,运行示例程序。
<强>库基类——查询
强>
常见\ AbstractRepository。cs是库的基类,实现了增删改查的一些方法,例如:
公共虚拟Tuple找到(Expression 比;标准 ,int pageIndex ,int页大小 ,string [] asc ,string [] desc params Expression 在[]includeProperties)
这个方法是AbstractRepository查询方法中的一个,用于自定义分页查询,其中标准为一个表达式,作为查询的条件,参数pageIndex,页大小,asc, desc为分页相关参数;
关于多表(关联表):
includeProperties为在多表时候,加入相关联的表。因为EF默认是延迟加载,相关联的表默认不是立即加载的,所以有时候如果写代码不小的心,在为循环里就有可能会循环查询n个字表。用来includeProperties参数,就可以在查询时候加入关联表。
<强>库基类——增删改
强>
AbstractRepository已经用泛型实现了增删改方法:
公共虚拟T (T实体)
公共虚拟T更新实体(T)
公共虚拟T CreateOrUpdate实体(T)
公共虚拟空间删除(TId id)
另外,关于交易的实现,我使用了工作单元模式,多个库共享一个DBContext,关于UOW,请在常见\ UnitOfWork。cs里找到。
调用UOW的时候,基本类似于这样:
var uow=new EFUnitOfWork (); var回购=uow.GetLogRepository (); 回购。创建新日志 { LevelId=1, 线程=啊? 位置=笆侄疌reation" 消息=?这是手动创建的日志!” CreateTime=DateTimeOffset.Now, 日期=DateTime.Now }); uow.Commit ();
从UnitOfWork里得到一个或多个库,共享DBContext,做增删改操作,最后uow统一SaveChanges。
<强>存储库的派生类
强>
由于已经有了AbstractRepository,实现了增删改查的很多方法,所以派生类,例如示例项目里的LogRepository基本就可以变得很简单,主要实现一些特定的业务逻辑,在示例项目里,因为没有特殊的业务逻辑,所以会很简单:
公共类LogRepository: AbstractRepository<日志,int> { 公共LogRepository (EFContext上下文) :基地(上下文) { } }
<>强关于实体的生成强>
本人比较喜欢数据库第一次实现,先设计数据库,然后用edmx逆向工程,生成少。可以参考实体目录下的相关文件。
当然,如果你喜欢代码首先,同样没有问题,仍然适用本文的实现。
<强>使用日志记录日志追踪EF SQL
强>
在使用实体框架的时候,最好关心一下EF所生成的SQL,这样可以在开发阶段发现一些潜在的性能问题,避免在生产环境焦头烂额:)
\ EFContext在常见。cs里,有一个配置项EnableTraceSql,如果为真,那么所以英孚生成的SQL将会被nlog记录下来。我将nlog的日志配置到了数据库。也就是说,在你运行示例项目时,每次查询,都会增加新的日志记录,内容为查询时生成的SQL:
<强>规范模式
强>
在查询方法里,有个重载是接受一个ISpecification示例,这样的实现可以有效的控制业务逻辑,对于写给被其他人调用的接口来说,可以明确的确定查询参数,例如:
实体框架自定义分页效果的实现方法