如题,小弟在此有几个疑问,先请教各路大佬,
1、EntityFramework6如何提高性能,我现在有5张表,每张都有5000多数据,每张表的字段有20多个,经过逻辑处理有要做更新,每2s更新一次,现在的性能非常差,更新500条数据都要8s。
2、EntityFramework6如何处理脏读,幻读。例如处理订单金额,商品数量怎么不让它计算出错。

解决方案 »

  1.   

    脏读、幻读是数据库系统事务概念,跟 EF 无关,EF 只是客户端的编程,你可以用也可以不用 EF (用其它DAL框架,例如直接用 ADO.NET)来操作数据库。
      

  2.   

    EF 作为客户端工具,它本身并没有什么性能问题。顶多就是说你的 Model 的设计可能有问题,真正的编程应该以 code-first 为根本而不是 db-first 的,也就是说对一个表的访问应该可以用不同的 model,没有必要读写 20个字段——仅需要读写3个字段时——就不应该用20个字段读写的 EF 方法。除此以外,“性能差”应该整体数据持久操作流程(你应该用流程图来描述,而不是个别语句)设计思路问题。跟某种具体的 DAL 工具无关。
      

  3.   

    好的,谢谢,还想大佬以我现在的项目设计模式指导下,我现在使用的是EF6+SQLServer2016,要控制商品的数量不会错乱和用户的金额不会出错,而且并发量比较大,请指导下在现在的项目基础上要怎么去控制好?
      

  4.   

    EF中的函数方法使用不当必然会造成执行sql慢,等待数据库返回数据慢的问题,比如查询某列的值,能使用where,就不要使用FirstOrDefault;能不设定实体跟踪就不设置跟踪;尽量不要直接返回List,而是IQueryable集合,等等。使用的得当就不会有什么性能问题,这个需要尝试去分析真实执行的sql语句来发现没有必要的查询嵌套。
      

  5.   


    好的,谢谢,还想大佬以我现在的项目设计模式指导下,我现在使用的是EF6+SQLServer2016,要控制商品的数量不会错乱和用户的金额不会出错,而且并发量比较大,请指导下在现在的项目基础上要怎么去控制好?
      

  6.   

    打扰了,请教下,我现在的情况找单个实体的话都是用Find,如果要取到多种条件的数据都是ToList在使用Where,但是性能上还是不理想。求指导
      

  7.   

    打扰了,请教下,我现在的情况找单个实体的话都是用Find,如果要取到多种条件的数据都是ToList在使用Where,但是性能上还是不理想。求指导
    应该先Where再ToList吧
      

  8.   

    打扰了,请教下,我现在的情况找单个实体的话都是用Find,如果要取到多种条件的数据都是ToList在使用Where,但是性能上还是不理想。求指导
    Find方法会先在EF的缓存中查找数据,如果找到就返回,找不到再执行数据库查询。Context上下文会追踪Entity的状态,这个状态表示的是在缓存中的状态,而非数据库中。之后进行savechanges才会将更改提交到数据库。 ToList是直接把数据加载到内存中,这样就产生了没必要的数据显示,I/O操作是比较耗时的,在读写服务器数据库里的数据再返回时,网络通信也有一定的影响。使用where 就是过滤数据,不查询没必要的显示。 使用IEnumerable,会使用集合的时候才去执行查询,这其实是一个什么时候加载数据的区别。
      

  9.   

    建议获取真实的执行sql语句分析在优化方法。
      

  10.   

    就好像软件工程师编程设计靠的是 .net framework 而不是 c# 一样,数据库“增删改查”编程靠的是数据库原理和 sql 的理解而不是什么 ef。相反地,ef 其实是为了让编程稍微省点力,反而是以丧失(一点儿)程序处理性能为代价的。例如明明只是操作个别字段时却要整个表的所有字段都操作。总有人把个别工具当作出发点。
      

  11.   


    这显然是不应该的。查询操作应该把(ef 引擎)产生的 sql 语句交给数据库服务器系统去在服务器上直接执行查询算法,而不是把几百万条数据 copy 到客户端内存里再来过滤。