Entity Framework 学习高级篇1—改善EF代码的方法(上)
本节,我们将介绍一些改善EF代码的相关方法,如NoTracking,GetObjectByKey, Include等。
l MergeOption.NoTracking
当我们只需要读取某些数据而不需要删除、更新的时候,可以指定使用MergeOption.NoTracking的方式来执行只读查询(EF默认的方式是AppendOnly)。当指定使用NoTracking来进行只读查询时,与实体相关的引用实体不会被返回,它们会被自动设置为null。因此,使用NoTracking可以提升查询的性能。示例代码如下:
[Test]
public void NoTrackingTest()
{
using (var db = new NorthwindEntities1())
{
//针对Customers查询将使用MergeOption.NoTracking
db.Customers.MergeOption = MergeOption.NoTracking;
var cust = db.Customers.Where(c => c.City == "London");
foreach (var c in cust)
Console.WriteLine(c.CustomerID);
//也可以这样写
//var cust1 = ((ObjectQuery<Customers>)cust).Execute(MergeOption.NoTracking);
//Esql写法
//string esql = "select value c from customers as c where c.CustomerID='ALFKI'";
//db.CreateQuery<Customers>(esql).Execute(MergeOption.NoTracking).FirstOrDefault();
}
}
l GetObjectByKey/First
GetObjectByKey:
在EF中,使用GetObjectByKey方法获取数据时,它首先会查询是否有缓存,如果有缓存则从缓存中返回需要的实体。如果没有则查询数据库,返回需要的实体,并添加在缓存中以便下次使用。
First: 总从数据库中提取需要的实体。
因此,我们应在合适的地方选择GetObjectByKey方法来获取数据,以减少对数据库的访问提升性能。示例代码如下:
[Test]
public void GetByKeyTest()
{
using (var db = new NorthwindEntities1())
{
//从数据库中提取数据
var cst = db.Customers.First(c => c.CustomerID == "ALFKI");
Console.WriteLine(cst.CustomerID);
//将从缓存中提取数据
EntityKey key = new EntityKey("NorthwindEntities1.Customers", "CustomerID","ALFKI");
var cst1 = db.GetObjectByKey(key) as Customers;
Console.WriteLine(cst1.CustomerID);
}
}
此外,需要注意的是如果GetObjectByKey没有获取到符合条件的数据,那么它会抛异常。为了避免此情况发生,在有可能出现异常的地方,我们应该使用TryGetObjectByKey方法。TryGetObjectByKey方法获取数据的方式和GetObjectByKey类似,只是当没有取到符合条件的数据时,TryGetObjectByKey会返回null而不是抛异常。示例代码如下:
[Test]
public void TryGetByKeyTest()
{
using (var db = new NorthwindEntities1())
{
//没有符合条件的数据会有异常抛出
EntityKey key = new EntityKey("NorthwindEntities1.Customers", "CustomerID","♂风车车.Net");
var cst = db.GetObjectByKey(key) as Customers;
Console.WriteLine(cst.CustomerID);
//没有符合条件的数据会有返回null
EntityKey key1 = new EntityKey("NorthwindEntities1.Customers", "CustomerID","♂风车车.Net");
Object cst1 = null;
db.TryGetObjectByKey(key1, out cst1);
if (cst1 != null)
Console.WriteLine(((Customers)cst1).CustomerID);
}
}
l First /FirstOrDefault
First: 当我们使用First来获取数据,如果没有符合条件的数据,那么我们的代码将会抛出异常。
FirstOrDefault: 当我们使用FirstOrDefault来获取的数据,如果没有符合条件的数据,那么它将返回null。
显然,对于一个良好的代码,是对可以预见的异常进行处理,而不是等它自己抛出来。示例代码如下:
[Test]
public void FirstTest()
{
using (var db = new NorthwindEntities1())
{
//抛异常的代码
var cst = db.Customers.First(c => c.CustomerID == "♂风车车.Net");
Console.WriteLine(cst.CustomerID);//此处将出抛异常
//推荐的使用如下代码:
var cst1 = db.Customers.FirstOrDefault(c => c.CustomerID == "♂风车车.Net");
if (cst1 != null)
Console.WriteLine(cst1.CustomerID);
}
}
l 延迟加载/Include
EF不支持实体的部分属性延迟加载,但它支持实体关系的延迟加载。默认情况,实体的关系是不会加载。如下代码:
[Test]
public void IncludeTest()
{
using (var db = new NorthwindEntities1())
{
var csts = db.Customers;
foreach (var c in csts)
{
Console.WriteLine(c.CustomerID);
foreach (var o in c.Orders)
Console.WriteLine(" " + o.OrderID);
}
}
}
上述代码中,因为Orders没有被加载,所以在输出Orders的时候,是不会有任何输出的。
当我们需要加载某些关联的关系时,可是用Include方法,如下代码所示:
[Test]
public void IncludeTest()
{
using (var db = new NorthwindEntities1())
{
var csts = db.Customers.Include("Orders");
foreach (var c in csts)
{
Console.WriteLine(c.CustomerID);
foreach (var o in c.Orders)
Console.WriteLine(" " + o.OrderID);
}
}
}
上述代码中,Customers关联的Orders将被加载。
Entity Framework 学习高级篇1—改善EF代码的方法(上)的更多相关文章
- Entity Framework 学习高级篇2—改善EF代码的方法(下)
,IQueryable<Customers>>( (database) => database.Customers.Where(c => c.City == " ...
- 【.NET-EF】Entity Framework学习笔记1 - VS2013没有EF的解决方法
解决方法:我本来也没有,百度了一下,在C:\ProgramData\Package Cache\{08AEF86A-1956-4846-B906-B01350E96E30}v12.0.20912.0\ ...
- Entity Framework 学习中级篇1—EF支持复杂类型的实现
本节,将介绍如何手动构造复杂类型(ComplexType)以及复杂类型的简单操作. 通常,复杂类型是指那些由几个简单的类型组合而成的类型.比如:一张Customer表,其中有FristName和Las ...
- Entity Framework学习初级篇2
Entity Framework 学习初级篇2--ObjectContext.ObjectQuery.ObjectStateEntry.ObjectStateManager类的介绍 本节,简单的介绍E ...
- 改善EF代码的方法(下)
本节,我们将介绍一些改善EF代码的方法,包括编译查询.存储模型视图以及冲突处理等内容. > CompiledQuery 提供对查询的编译和缓存以供重新使用.当相同的查询需要执行很多遍的时候,那么 ...
- 改善EF代码的方法(上)
本节,我们将介绍一些改善EF代码的相关方法,如NoTracking,GetObjectByKey, Include等. > MergeOption.NoTracking 当我们只需要读取某些数据 ...
- Entity Framework 学习初级篇1--EF基本概况
转自:http://www.cnblogs.com/Tally/archive/2012/09/14/2685011.html 最近在学习研究微软的EF,通过这时间的学习研究,感觉这个EF目前来说还不 ...
- Entity Framework学习初级篇1--EF基本概况《转》
最近在学习研究微软的EF,通过这时间的学习研究,感觉这个EF目前来说还不是很完善,半成品.不过,据说在.Net4.0中,微软将推荐使用此框架,并会有所改善.而且,现在基本上所有数据库均提供了对EF的支 ...
- Entity Framework 学习初级篇--EntityClient(转)
摘自:http://www.cnblogs.com/xray2005/archive/2009/05/13/1456374.html System.Data.EntityClient 命名空间是 实体 ...
随机推荐
- HTML5预览图片、异步上传文件
注意啦:本文的代码都是以JQuery为示例,jq_开头的变量都是jq对象. 在HTML5中,我们可以在图片上传之前对图片进行预览,就像下面这么做 jq_upload_file.change(funct ...
- Ninja:Java全栈Web开发框架-Ninja中文网
相信不少业界人士都还停留在SSh的时代 其实我想给大家推荐的一个轻量级框架那就是Ninja; Ninja是一个Java全栈Web开发框架,稳定.快速.非常高效. 商业价值 在你的下一个项目中,Ninj ...
- linux jdk环境变量
export JAVA_HOME=/usr/share/jdk8 export PATH=$JAVA_HOME/bin:$PATH export CLASSPATH=.:$JAVA_HOME/lib/ ...
- php 异步
.post(handle,{username: username.val(),content: content.val()},function(data){ },'json');
- Java 多态 父类和子类方法的访问控制权限
Java 多态 父类和子类方法的访问控制权限 @author ixenos 父类和子类方法的访问控制权限 继承是为了扩展类的功能,而这种扩展显然就是对一个原始类的扩展,目的还是向上转型来调用,所以这就 ...
- Python 中的GIL
GIL:Global Interpreter Lock, 全局解释器锁定,是指python虚拟机在执行多线程程序时,任一时刻只有一个线程在执行,这使得多线程程序无法充分利用CPU.对于一般的多 ...
- Openjudge-计算概论(A)-取石子游戏
描述: 有两堆石子,两个人轮流去取.每次取的时候,只能从较多的那堆石子里取,并且取的数目必须是较少的那堆石子数目的整数倍.最后谁能够把一堆石子取空谁就算赢. 比如初始的时候两堆石子的数目是25和7 2 ...
- CentOS 6下的VPN搭建
PPTP 全称为 Point to Point Tunneling Protocol — 点到点隧道协议,是VPN协议中的一种.虚拟专用网(VPN)被定义为通过一个公用网络(通常是因特网)建立一个临时 ...
- 飞雪桌面日历软件 V8.6 免费绿色版
软件名称: 飞雪桌面日历软件软件语言: 简体中文授权方式: 免费软件运行环境: Win7 / Vista / Win2003 / WinXP / Win2008软件大小: 4MB图片预览: 软件简介: ...
- submit提交表单后,不刷新当前页面
<form method="get" target="test" action="a.html"> <input type ...