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 命名空间是 实体 ...
随机推荐
- 伪分布重新格式化hdfs
重新格式化hdfs系统的方法: (1)查看hdfs-ste.xml: <span style="font-size:18px;"><property> &l ...
- Android View的事件分发
如果接触android开发时间足够长的话,或多或少都会遇到各种各样事件冲突的问题,要想解决这类问题,对深入理解事件分发机制是很有必要的,接下来几天都会尽自己所能尽可能将这方面讲清楚. View的事件 ...
- 奇葩json结构解析--key是数字的json处理
json结构如下: { "ret": "ok", "data": { "57230": { "cat_id&q ...
- 判断浏览器是否支持html5和css3属性
本文章内容是由一个前辈写的. CSS3特有的属性moz-Transform //判断是否具有相应属性 testProps: function (props) { var i; for (i in pr ...
- geom设置—折线图
折线图在R中也是很常见的一种图形,相对而言也比较简单. geom_line(mapping = NULL, data = NULL, stat = "identity", posi ...
- hdu_2717_Catch That Cow_bfs
题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=2717 题解:一维简单BFS,详细看代码,0ms. #include<cstdio> #in ...
- [POJ] 1562 Oil Deposits (DFS)
Oil Deposits Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 16655 Accepted: 8917 Des ...
- Java线程--interrupt join yield setDaemon常用方法的使用
概念: 操作系统可以有多个进程,一个线程可以有一个或多个线程.进程与进程之间不共享内存,都在各自的空间中运行.而线程不仅可以共享内存,还可以用有一个自己的内存空间,叫做线程栈. 线程又称轻量级进程.J ...
- git clone 出现 RPC failed 错误的解决方案
今天使用git clone一个大型项目的时候出现了如下错误:
- Mac OS终端提示符前缀”bogon”
像往常一样新打开一个终端,却发现一个很有意思的现象,以前的提示符的组成为: [机器名]:~[用户名] 以前:YangGavin's MacBook Pro:~ yanggavin$ 现在:bogon: ...