本节,我们将介绍一些改善EF代码的方法,包括编译查询、存储模型视图以及冲突处理等内容。

> CompiledQuery

提供对查询的编译和缓存以供重新使用。当相同的查询需要执行很多遍的时候,那么我们可以使用ComplieQuery将查询的语句进行编译以便下次使用,这样可以免去对同一语句的多次处理,从而改善性能。
示例代码如下:

public void ComplieTest()
{using (var db = new NorthwindEntities1()){//对查询进行编译var customer = CompiledQuery.Compile<NorthwindEntities1, IQueryable<Customers>>((database) => database.Customers.Where(c => c.City == "London"));//执行20次相同的查询for (int i = 0; i < 20; i++){DateTime dt = System.DateTime.Now;foreach (var c in customer(db))Console.WriteLine(c.CustomerID);Console.WriteLine(DateTime.Now.Subtract(dt).TotalMilliseconds);Console.WriteLine("---------------------------------------------------");}}
}

> 存储模型视图

在EF中,当执行实体查询的时候,运行时首先将实体模型转换成ESQL视图,而ESQL视图则是根据msl文件来生成相应的代码。此外,ESQL视图包含了相应的查询语句。ESQL视图被创建后将在应用程序域中进行缓存以便下次使用。这个运行时生成存储模型视图是比较耗时的过程。
为了,免去运行时生成存储模型视图,我们可以预先产生这个的存储模型视图。具体步骤如下:
首先,使用EdmGen2来产生存储模型视图,相应的命令如下:

  Edmgen2 /ViewGen cs NorthwindEntites.edmx

执行此命令后,edmgen2会在当前目录下生成一个名为NorthwindEntites.GeneratedViews.cs这个文件,就是我们要使用的存储模型视图文件。
将此文件添加到项目中就行,其他的代码不需要改变,EF会自动调用此视图文件。
如下示例代码:

public void ViewTest()
{using (var db = new NorthwindEntities1()){var suppliers = db.Suppliers;foreach (var s in suppliers)Console.WriteLine(s.ContactName);}
}

没有使用存储模型视图的情况是:
1 passed, 0 failed, 0 skipped, took 7.09 seconds.

项目中添加了NorthwindEntites.GeneratedViews.cs文件,执行情况是:
1 passed, 0 failed, 0 skipped, took 5.38 seconds.

可见,使用了存储模型视图的确是提高了性能。

> 冲突处理

在EF中,默认情况并不会检查并发冲突。因为EF实现的是乐观的并发模式,当有并发的冲突发生时,将会抛出Optimistic Concurrency Exception异常。我们可以通过使用RefreshMode这个枚举来指定当发生冲突时如何处理。

RefreshMode有两中枚举值:
ClientsWins: 当提交修改,更新数据库中的值
StoreWins: 放弃修改,使用数据库中的值

示例代码片段如下:

  var db2 = new NorthwindEntities1();var customer2 = db2.Customers.FirstOrDefault(c => c.CustomerID == "2009");if (customer2 != null){customer2.ContactName = "风车车.Net";customer2.City = "CD";customer2.Region = "GX";}try{db2.SaveChanges();}catch (OptimisticConcurrencyException ex) //捕获到冲突,则进行相应的处理
    {db2.Refresh(RefreshMode.ClientWins, customer2);db2.SaveChanges();}

上述代码片段,只是说明怎么处理并发冲突,不是具体的并发。

转载于:https://www.cnblogs.com/xgao/p/4200608.html

改善EF代码的方法(下)相关推荐

  1. Entity Framework 学习高级篇2—改善EF代码的方法(下)

    本节,我们将介绍一些改善EF代码的方法,包括编译查询.存储模型视图以及冲突处理等内容. l         CompiledQuery 提供对查询的编译和缓存以供重新使用.当相同的查询需要执行很多遍的 ...

  2. Entity Framework 学习高级篇1—改善EF代码的方法(上)

    本节,我们将介绍一些改善EF代码的相关方法,如NoTracking,GetObjectByKey, Include等. l         MergeOption.NoTracking 当我们只需要读 ...

  3. java 不可修改的集合对象_[改善Java代码]asList方法产生的List对象不可更改

    上一个建议之处了asList方法在转换基本类型数组时候存在的问题,在看下asList方法返回的列表有何特殊的地方.看代码: importjava.util.Arrays;importjava.util ...

  4. java 代码解析工具_改善 Java 代码质量的工具与方法

    原标题:改善 Java 代码质量的工具与方法 我们可能见过上面的有关代码质量的图片,究竟如何衡量一段代码好坏? 代码质量是什么?为什么它很重要? 作家通过他的著作来讲述了一个清晰的.令人信服的故事.他 ...

  5. 改善Java代码有哪些方法?

    前言 Java是一门优秀的面向对象的编程语言,针对遇到同样的一个问题会有很多中解法哪种实现方法是最好的呢,还需要不断的探究JDK的底层原理.我会例出Java改善的建议哦,希望大家可以在平时开发工作去使 ...

  6. emd 消除端点效应 matlab代码,对五种改善EMD端点效应的方法进行分析

    引言 1998年,Huang等人提出了一种新的信号处理方法:经验模态分解方法(EmpiricalModeDecomposition,EMD).它用不同特征尺度的数据序列本征模函数(IntrinsicM ...

  7. Eclipse Jee 2019-09 的快键键与搜狗输入法有冲突,中文状态下快速格式化代码的方法。

    Eclipse Jee 2019-09 的快键键与搜狗输入法有冲突,英文状态下快速格式化代码的方法. Ctrl+Shift+F 当使用搜狗输入法的中文输入状态下,该快捷键就不好使了. 通过以上步骤能解 ...

  8. 小白学Java代码:方法Method(下)

    package demo1; //注意:当一个Java源文件在指定的包中存放,则该源文件中第一行必须是包的声明,否则源文件必须在src目录下存放public class Method01 { } 编写 ...

  9. 王者荣耀在android目录下的名字,王者荣耀名字空白代码怎么弄_名字空白代码设置方法...

    王者荣耀名字空白代码怎么弄?名字空白代码设置方法.王者荣耀中起一个好听的名字是非常重要的,不少玩家看到别人名字有空白都想知道怎么弄,下面apk8小编为玩家们带来了名字空白代码设置方法,点进来看看. 王 ...

最新文章

  1. 撬开骁龙8一看,满满都是顶会论文
  2. Java程序员从笨鸟到菜鸟之(八十五)跟我学jquery(一)爱之初体验jquery
  3. 15---Net基础加强
  4. 作为我的第一篇csdn博客吧
  5. 英语口语(5月17)
  6. ibatis的isequal_isequal ibatis
  7. Centos 7安装与配置nagios监控(一)
  8. linux文本运行层次,Linux基础知识之---文件系统层级结构
  9. python创建sqlite3 unicode error_python/sqlite3:发生异常:sqlite3.operationalerror
  10. xpath 取标签下所有文字内容_xpath提取目录下所有标签内的内容,递归 //text()...
  11. 北京时间的拼音及解释
  12. cmake list all directories
  13. python期末考试及答案广东_PYTHON语言应用答案试题题目及答案,期末考试题库,章节测验答案...
  14. 直方图规定化的编程实现
  15. Travis CI mysql_连续集成 – 使用Travis CI配置Mysql 5.7
  16. 结束 oracle 锁 ps -ef|grepp.spid,oracle 解锁表剔除去session 和kill
  17. Pandas入门基本知识点
  18. 【2022.11】5分钟注册好美区Apple ID,稳定有效
  19. 初始C语言-分支与循环语句
  20. git常用命令和基本操作

热门文章

  1. spring cloud 定时任务
  2. Day 6:Vector类和实现Hashset以及登录窗口的模拟
  3. Functions that return a function
  4. nodejs开发游戏服务器遇到的性能问题
  5. svn提示out of date的解决方法
  6. 第二百六十一、二天 how can I坚持
  7. android第八步查看与输出日志信息
  8. 选择学习“下一个”程序语言
  9. 精准评论,为何广受娱乐类产品的欢迎?
  10. 3分钟学会如何调度运营海量Redis系统