前言

  • 在编写代码的时候,我遇到了很多关于EntityFramework6的疑问,所以现在就提前把这些问题列出来做一下解答,以便在以后的代码编写过程中减少不必要的Bug。

EntityFramework6的延迟加载(Lazy Loading)是怎么一回事?

  • 首先EntityFramework6的延迟加载默认是被支持的,可以通过设置context.Configuration.LazyLoadingEnabled = false来禁止。
  • 当启用延迟加载的时候,EntityFramework访问实体的相关对象时,也就是一对一、一对多的属性时,EntityFramework会从你定义的实体派生出一个动态对象,然后覆盖你的子实体集合访问属性来实现。所以我们在定义POCO类的时候,会在关系属性前加上virtual 来修饰。如果不加修饰,就不会启动延迟加载。
  • 延迟加载,就是在查找某个实体时,会把相关联的实体对象或者集合全部加载出来。
  1. 启用延迟加载的情况,执行以下语句

  

  Sql Server Profiler监视情况如下:

  

  

  

  从上面的结果可以看出,当我们需要获取Role对象的时候,EntityFramework会把与之关联的对象以动态代理对象(DynamicProxy)

  的方式加载出来,数据库也向与之关联的表执行了多个关联查询才得到结果。

  2. 禁用延迟加载的情况,执行以下语句

  

  Sql Server Profiler监视情况如下:

  

  

  从上面的结果可以看出,执行的结果只有Role对象,与之关联的对象S_Menus为null,S_Users也没有结果,说明在禁用延迟加载的情况下,

  EntityFramework只对当前执行的上下文对象进行查询。Sql Server Profiler监视情况的结果也是如此,程序只执行了对S_Role表的读取

EntityFramework6DbContext 适合单例模式吗?

  • 之前我们在用三层架构的时候,我们通常会把DBHelper类的支持方法设置为静态方法,这样我们不需要实例化就可以调用执行方法。因此我在想DbContext我们能不能使用单例模式来进行创建?答案是不可以的。因为在同一个DbContext实例上下文中,如果A正在编辑某条数据,B也正在编辑某条数据,B在编辑后进行SaveChanges操作,就会把A编辑的数据也进行提交。而实际A编辑的数据可能被取消,但是也提交到了数据库进行更改,这肯定不是我们需要的结果。
  • 如果我们创建了多个DbContext的实例,就可能会遇到并发的问题,因为不同的实例可能会对同一条数据进行修改。EntityFramework可以使用乐观锁来解决此问题。

EntityFramework6怎样使用事务?

  • EntityFramework的DbContext中的SaveChanges就自带事务与分布式事务。
  • 如果我们的语句是在同一个DbContext的实例进行提交,那么DbContext中的SaveChanges就会默认启动事务,如果有一条语句执行失败,那么事务就会回滚。SaveChanges不会执行。
  • 如果我们的语句是在不同的DbContext的实例中进行提交,那我们就要采用分布式事务,也就是TransactionScope来开启。在TransactionScope中的任意一个DbContext的SaveChanges行失败后,其他的实例的SaveChanges也不会被执行,从而达到了事务控制的目的。

EntityFramework6中有缓存实现吗?

  • 就目前而言,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。当你打算马上使用查询后的结果(比如循环作逻辑处理或者填充到一个table/grid中),并且你不介意该查询会即时执行,使用ToList();当你希望查询后的结果可以供调用者(Consummer)作后续查询(比如这是一个"GetAll"的方法),或者你希望该查询延时执行,使用AsQueryable()

EF6 CodeFirst+Repository+Ninject+MVC4+EasyUI实践(五)的更多相关文章

  1. EF6 CodeFirst+Repository+Ninject+MVC4+EasyUI实践(一)

    前言 本系列源自对EF6 CodeFirst的探索,但后来发现在自己项目中构建的时候遇到了一些问题以及一些解决方法,因此想作为一个系列写下来. 本系列并不是教你怎么做架构设计,但可以参照一下里面的方法 ...

  2. EF6 CodeFirst+Repository+Ninject+MVC4+EasyUI实践(六)

    前言 在接下来的篇幅里将对系统的模块功能进行编写.主要以代码实现为主.这一篇我们需要完成系统模块“角色管理”的相关功能.完成后可以对系统框架结构有进一步了解. Abstract层 之前说过,Abstr ...

  3. EF6 CodeFirst+Repository+Ninject+MVC4+EasyUI实践(完)

    前言 这一篇是本系列的最后一篇,虽然示例讲到这里就停止呢,但对于这些技术的学习远不能停止.虽然本示例讲的比较基础,但是正如我第一篇说到的,这个系列的目的不是说一些高端的架构设计,而是作为一个入门级,对 ...

  4. EF6 CodeFirst+Repository+Ninject+MVC4+EasyUI实践(八)

    前言 本篇幅将对系统的菜单管理模块进行说明,系统的菜单采用树形结构,这样可以更好地方便层级设计和查看.本示例将说明如何通过EntityFramework读取递归的菜单树形结构,以及结合EasyUI的t ...

  5. EF6 CodeFirst+Repository+Ninject+MVC4+EasyUI实践(七)

    前言 上一篇文章我们完成了系统角色管理的基本功能实现,也对系统层次结构进行了了解.这一篇我们将继续对系统的用户管理模块进行代码编写.代码没有做封装,所以大部分的逻辑代码都是相通的,只是在一些前端的细节 ...

  6. EF6 CodeFirst+Repository+Ninject+MVC4+EasyUI实践(四)

    前言 这一篇,我们终于到了讲解Entity Framework CodeFirst 的时刻了,首先创建实体对象模型,然后会通过配置Fluent API的方式来对实体对象模型进行完整的数据库映射操作. ...

  7. EF6 CodeFirst+Repository+Ninject+MVC4+EasyUI实践(三)

    前言 在上一篇中,我们依靠着EasyUI强大的前端布局特性把前端登录界面和主界面给搭建完成了.这一篇我们就要尝试着把整个解决方案部署到云端呢,也就是Visual Studio Online(TFVC) ...

  8. EF6 CodeFirst+Repository+Ninject+MVC4+EasyUI实践(二)

    前言 写完第一篇后,我一直在想接下来应该从哪一方面开始讲.后来我觉得不用那么死板的把每一个课程和大纲都列出来吧,毕竟我又不是教书的,呵呵...我觉得就像做实验一样,我们一部分一部分的完成,最后总个结果 ...

  9. EF6 CodeFirst+Repository+Ninject+MVC4+EasyUI实践(九)

    前言 这一篇我们将完成系统的权限设置功能以及不同角色用户登录系统后动态加载菜单.注意:此示例权限只针对菜单级,如果园友需要更复杂的系统权限设置,可以拓展到按钮级或属性级. 用户的登录采用Form认证来 ...

随机推荐

  1. tomcat 配置客户端证书认证

    在完成配置客户端证书认证后,浏览器以https访问服务器的时候,会提示选择证书,之后,服务器端会验证证书.也就意味着只有拥有有效证书的客户端才能打开该网站. 以下是具体的配置过程. 1. 在服务器端生 ...

  2. https 单向认证和双向认证配置

    HTTPS 是我们开发中经常用到的通信加密技术,能有效保护我们网络访问中的安全,本文主要讲解单向 和 双向 https 的配置.关于https 的实现原理在这里我就不赘述了,附上阮一峰老师的关于htt ...

  3. 根据osdid 查询磁盘是ssd盘还是sas盘

    前置条件: 1.安装LSI的Megacli软件包 Megacli64 2.安装scsi设备的查询工具lsscsi apt-get install lsscsi   步骤: 1.根据osdid 查找 盘 ...

  4. dpkg: 处理归档 /var/cache/apt/archives/软件名 (--unpack)时出错:由于已经达到 MaxReports 限制,没有写入 apport 报告。

    一.环境介绍: OS:ubuntu16.04 64bit 二.错误如下: 正准备解包 .../libqt4-script_4%3a4.8.7+dfsg-5ubuntu2_i386.deb  ...正在 ...

  5. git中常用命令小结

    提交过程 查看文件改动以及新增的文件 git status 添加新增文件 git add your_file_path // 添加全部文件 git add * // 添加某类型文件 提交文件 git ...

  6. css Animation初体验

    目前有越来越多的网站都使用animation,无论他们是用GIF,SVG,WebGL,视频背景或者其他形式展示.适当地使用动画会让网站更生动,互动性更好,为用户增加一个额外的反馈和体验层. 在本教程中 ...

  7. java贪吃蛇

    这个贪吃蛇有很多功能没有实现,比如说穿墙(本来可以实现,但是穿墙后,就会出现坐标混乱,吃不到食物了),还有碰到自己的身体死亡的情况也没有实现,现在我知道如何判断是否碰到身体,但是,我不知道,如何处理碰 ...

  8. 16个基本颜色关键字 Basic color keywords

    16个基本颜色关键字 Basic color keywords Color Color Name HEX RGB   black #000000 0,0,0   silver #C0C0C0 192, ...

  9. python成长之路【第十二篇】:RabbitMQ入门

    一.RabbitMQ介绍 解释RabbitMQ,就不得不提到AMQP(Advanced Message Queuing Protocol)协议. AMQP协议是一种基于网络的消息传输协议,它能够在应用 ...

  10. Jenkins的安装与配置

    资源下载: --jenkins的war包 首先从http://jenkins-ci.org/下载最新的jenkins版本,最新版本为1.594,下载的文件载体为jenkins.war: Jenkins ...