实体框架自定义分页效果的实现方法

  

实体框架自定义分页效果的实现方法?这个问题可能是我们日常学习或工作经常见到的。希望通过这个问题能让你收获颇深。下面是小编给大家带来的参考内容,让我们一起来看看吧!

<强>简介

之前写个一个基于衣冠楚楚的分页实现,现在再来写一个基于实体框架的分页实现,以及增删改的通用实现。

<强>代码

还是先上代码: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示例,这样的实现可以有效的控制业务逻辑,对于写给被其他人调用的接口来说,可以明确的确定查询参数,例如:

实体框架自定义分页效果的实现方法