EasyUIEF6 CodeFirst+Repository+Ninject+MVC四+EasyUI实践(5)

前言

 

  • 在编制代码的时候,小编遇到了重重有关EntityFramework6的疑云,所未来后就提前把这个题材列出来做一下解答,以便在随后的代码编写进度中减掉不必要的Bug。

 

EntityFramework陆的延迟加载(Lazy Loading)是怎么1回事?

 

  • 首先EntityFramework6的推迟加载暗许是被扶助的,能够经过设置context.Configuration.LazyLoadingEnabled
    = false来禁止。
  • 当启用延迟加载的时候,EntityFramework访问实体的连带对象时,也正是一定、一对多的质量时,EntityFramework会从您定义的实业派生出1个动态目的,然后覆盖你的子实体集合访问属性来兑现。所以大家在概念POCO类的时候,会在关乎属性前增进virtual 来修饰。假使不加修饰,就不会运营延迟加载。
  • 延迟加载,正是在搜索有个别实体时,会把相关联的实体对象可能聚众全部加载出来。
  1. 启用延迟加载的景况,执行以下语句

  EasyUI 1

  Sql Server Profiler监视意况如下:

  EasyUI 2

 

  EasyUI 3

 

  EasyUI 4

  从位置的结果能够阅览,当我们需求取得Role对象的时候,EntityFramework会把与之提到的目标以动态代理对象(DynamicProxy)

  的艺术加载出来,数据库也向与之提到的表执行了多少个事关查询才得到结果。

 

  二. 剥夺延迟加载的意况,执行以下语句

  EasyUI 5

  Sql Server
Profiler监视意况如下:

  EasyUI 6

  

   从地方的结果能够见到,执行的结果只有Role对象,与之提到的对象S_Menus为null,S_Users也尚无结果,表明在禁止使用延迟加载的景观下,

  EntityFramework只对当下推行的上下文对象开始展览查询。Sql
Server
Profiler监视意况的结果也是那般,程序只进行了对S_Role表的读取

 

EntityFramework6的DbContext 切合单例形式吗?

 

  • 此前大家在用三层架构的时候,大家普通会把DBHelper类的协理格局设置为静态方法,那样我们不须求实例化就能够调用执行办法。因而笔者在想DbContext大家能否选取单例方式来进展创办?答案是不可能的。因为在同五个DbContext实例上下文中,若是A正在编写制定某条数据,B也正在编辑某条数据,B在编辑后展开SaveChanges操作,就会把A编辑的数量也进展提交。而实际A编辑的数目可能被吊销,不过也交由到了数据库进行更改,那肯定不是大家供给的结果。
  • 1经大家创造了七个DbContext的实例,就或然会遭遇并发的题目,因为不一致的实例恐怕会对同一条数据开始展览改动。EntityFramework能够动用乐观锁来解决此题材。

 

EntityFramework六怎么着使用工作?

 

  • EntityFramework的DbContext中的SaveChanges就自带事务与分布式事务。
  • 比方大家的说话是在同3个DbContext的实例进行付出,那么DbContext中的SaveChanges就会暗中认可运行工作,如果有一条语句执行破产,那么事务就会回滚。SaveChanges不会实施。
  • 假若大家的讲话是在不相同的DbContext的实例中开始展览付出,那大家就要选拔分布式事务,也正是TransactionScope来打开。在TransactionScope中的任意1个DbContext的SaveChanges行退步后,其余的实例的SaveChanges也不会被实施,从而达到了作业控制的目标。

 

EntityFramework陆中有缓存达成啊?

 

  • 就当前而言,EntityFramework的缓存只是保证其内部的DbContext,也正是常说的拔尖缓存。固然要对EntityFramework的查询结果对象举行缓存,大家就须要接纳二级缓存来展开。常用的有些分布式应用缓存,如memcached或Redis都可以实现。CodePlex上也提供了部分二级缓存的实例,大家赋予通过Nuget直接下载使用,比如下边包车型客车那俩个缓存组件: 

    EntityFramework.Cache
 https://efcache.codeplex.com/

 

IQueryable, IEnumerable, IList 傻傻分不清楚?

   

  以下结论引用园友Teddy
Li
的博客:

  • IQueryable和IEnumerable都以延时执行(Deferred
    Execution)的,而IList是即时进行(Eager Execution)
  • IQueryable和IEnumerable在每便执行时都无法不再而三数据库读取,而IList读取一回后,今后各次都不需一连数据库。前两者很简单造成重复读取,品质低下,并且恐怕引发多少不壹致性
  • IQueryable和IEnumerable的分裂:IEnumberalb使用的是LINQ
    to
    Object情势,它会将AsEnumerable()时对应的具备记录都先加载到内部存款和储蓄器,然后在此基础上再实践后来的Query。
  • 依照质量和数量一致性那两点,我们利用IQueryable时必须审慎,而在大部情状下大家应选用IList。当你打算立尽管用查询后的结果(比如循环作逻辑处理还是填充到3个table/grid中),并且你不介意该查询会即时执行,使用ToList();当您愿意查询后的结果能够供调用者(Consummer)作后续查询(比如那是二个”GetAll”的法子),只怕您指望该查询延时执行,使用AsQueryable()