- 浏览: 1005358 次
- 性别:
- 来自: 天津
文章分类
- 全部博客 (445)
- Java (22)
- J2EE (18)
- Flex (102)
- Flex-blazeds (1)
- Flex-FABridge (2)
- Flex4 (3)
- CheckStyle (2)
- PowerDesigner (0)
- POI (2)
- Java2Word (2)
- 杂项 (15)
- 日记 (3)
- 数据库-oracle (41)
- 数据库-SQLServer (7)
- 中间件 (1)
- 英语 (8)
- C# (43)
- ASP.net (72)
- ASP.net MVC (28)
- 微软-Entity Framework (19)
- JavaScript (22)
- JQuery (31)
- EasyUI (3)
- VS2010 (4)
- CVS (1)
- Tomcat (3)
- Linux (1)
- 遗留问题 (1)
- iphone (1)
- MAC (0)
- 系统 (2)
- Web Service (4)
- Cache Manager (1)
- PMP (1)
- WCF (10)
- BootstrapJs (1)
- Web API (6)
- Go语言 (0)
- 网络协议 (2)
- Redis (10)
- RabbitMQ (10)
- Git (3)
- Kafka (5)
- ELK (5)
- Nginx (3)
- 测试 (2)
最新评论
-
ygm0720:
Table行拖拽自己实现 -
程乐平:
Flex4开发视频教程(27集)下载http://bbs.it ...
Flex4教程 -
liuweihug:
Jquery+asp.net 后台数据传到前台js进行解析的办 ...
AJAX $.toJSON的用法或把数组转换成json类型 -
weilikk:
谢谢谢谢!!
javascript IE下不能用 trim函数解决方法 -
gxz1989611:
vigiles 写道请问楼主:[Fault] exceptio ...
blazeds推送技术至Flex
本节,我们将介绍一些改善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将被加载。
l CompiledQuery
提供对查询的编译和缓存以供重新使用。当相同的查询需要执行很多遍的时候,那么我们可以使用ComplieQuery 将查询的语句进行编译以便下次使用,这样可以免去对同一语句的多次处理,从而改善性能。
示例代码如下:
[Test ]
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("---------------------------------------------------" );
}
}
}
l 存储模型视图
在 EF中,当执行实体查询的时候,运行时首先将实体模型转换成 ESQL视图,而 ESQL视图则是根据 msl文件来生成相应的代码。此外, ESQL视图包含了相应的查询语句。 ESQL视图被创建后将在应用程序域中进行缓存以便下次使用。这个运行时生成存储模型视图是比较耗时的过程。
为了,免去运行时生成存储模型视图,我们可以预先产生这个的存储模型视图。具体步骤如下:
首先,使用 EdmGen2来产生存储模型视图,相应的命令如下:
Edmgen2 /ViewGen cs NorthwindEntites.edmx
执行此命令后, edmgen2会在当前目录下生成一个名为 NorthwindEntites.GeneratedViews.cs 这个文件,就是我们要使用的存储模型视图文件。
将此文件添加到项目中就行,其他的代码不需要改变, EF会自动调用此视图文件。如下示例代码:
[Test ]
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.
可见,使用了存储模型视图的确是提高了性能。
l 冲突处理
在 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();
}
上述代码片段,只是说明怎么处理并发冲突,不是具体的并发。(ps:本来是准备开个线程来模拟并发的,但是始终没成功,没明白什么原因,望高人指点呢!)
发表评论
-
C# LINQ to SQL
2017-07-28 12:48 6381、Concat(连接不同的集合不会自动过滤相同项。会延迟计 ... -
基于 EntityFramework 的数据库主从读写分离服务插件
2017-03-08 15:06 11361. 版本信息和源码 1.1 版本信息 v1.01 be ... -
EF6(CodeFirst)+MySql开发
2017-01-06 14:08 1470如题,本文是使用EntityFramework6框架的感悟( ... -
<Entity Framework> - 直接执行数据库命令
2016-08-10 15:00 1511使用 EF 4.1 或者更新版本, 你可以直接执行任何数据库 ... -
EntityFramework执行SQL语句
2016-08-10 14:58 986在EF中执行Sql语句。 Insert Code: ... -
EntityFramework 执行SQL语句进行参数化查询代码示例
2016-08-10 14:59 1890在我们用EntityFramework时,一般情况下我们是要 ... -
Entity Framework 学习中级篇—使EF支持Oracle9i
2011-07-05 16:57 2960从Code MSDN上下载下来的EFOracleProvide ... -
Entity Framework 学习中级篇—EF支持复杂类型的实现
2011-07-05 16:56 12659http://www.cnblogs.com/xray20 ... -
Entity Framework 学习初级篇--ObjectContext、ObjectQuery、ObjectStateEntry、ObjectStateMa
2011-07-05 16:55 6904本节,简单的介绍EF中的 ObjectContext ... -
Entity Framework 学习初级篇--EF基本概况
2011-07-05 16:53 3651自从Entity Framework(EF ... -
Entity Framework 学习总结之十一:POCO
2011-06-30 11:24 12060POCO Entity Framework ... -
Entity Framework 学习总结之十:加载相关对象
2011-06-30 11:23 3792加载相关对象 实体类型可以定义在数据模型中表 ... -
Entity Framework 学习总结之九:LinqToEntities
2011-06-30 11:22 1614介绍 LINQ to Entities ... -
Entity Framework 学习总结之八:EntitySQL 复杂查询及函数
2011-06-30 11:21 2912复杂查询及函数 外键 Entity ... -
Entity Framework 学习总结之七:EntitySQL 基本查询
2011-06-30 11:20 2089Entity SQL 基本查询 SW ... -
Entity Framework 学习总结之六:EntitySQL 介绍入门
2011-06-30 11:19 1995Entity SQL Language 简介 ... -
Entity Framework 学习总结之五:EntityClient
2011-06-30 11:18 3494System.Data.EntityClient E ... -
Entity Framework 学习总结之四:对象服务介绍使用
2011-06-30 11:18 3052System.Data.Objects (System ...
相关推荐
Entity Framework 学习(中文资料初中高级共14篇) pdf格式
替换C:\Users\xxxxx\.nuget\packages\z.entityframework.extensions.efcore\2.1.49\lib\netstandard2.0下的Z.EntityFramework.Extensions.EFCore.dll。适用于.net core的ef,解除了1个月使用的限制。
entityframework框架源代码,需要深入了解entityframework的同学可以下载深入学习研究
Entity Framework 学习资料,值得下载的资源
如果使用Entity Framework也用了Z.EntityFramework.Plus.EF6且同时使用Entity Framework Profiler或MiniProfiler监控EF生成的SQL,你可能会遇到他们不兼容的问题,原因是Z.EntityFramework.Plus.EF6识别数据库类型...
Z.EntityFramework.Extensions 破解 注册机,详细破解方法
Z.EntityFramework.Extensions.EFCore 破解 ,支持.NET Core 3.1批量插入数据,速度很快。
Entity Framework 6 (EF6) is a tried and tested object-relational mapper (O/RM) for .NET with many years of feature development and stabilization.
[Apress] Entity Framework 4.0 高级程序设计 (英文版) [Apress] Pro Entity Framework 4.0 (E-Book) ☆ 出版信息:☆ [作者信息] Scott Klein [出版机构] Apress [出版日期] 2010年03月25日 [图书页数] 280页...
实体框架Ado.Net Entity Framework 是 ADO.NET 中的一组支持开发面向数据的软件应用程序的技术。在EF中,提出使用概念模型建模,直接针对关系型数据库的物理模型的建模的架构。
Entity Framework学习PDF及完整的NorthWind代码案例
ef entityframework服务端 封装dll
Entity Framework主从表使用
本资料系统全面的介绍了Entity Framework,对学习此ORM框架的开发人员帮助很大
是研究EF后所写下的EF学习笔记,主要讲解E-SQL及EF的实际应用等方面做全面介绍,希望对大家有用
Entity Framework 7 (EF7) provides a familiar developer experience to previous versions of EF, including LINQ, POCO, and Code First support. EF7 also enables access to data across relational and non-...
这是一本EF的入门书,麻雀虽小,五脏俱全。通过小项目对EF的关键技术如code-first做一个说明,让初学者对EF有个了解。
EntityFramework.dll
EF实例 entity framework