EF 学习笔记
2013年6月14日
14:14
EF在什么时候打开数据库连接
在如下时候会打开数据库连接:
- SaveChanges or Refresh on ObjectContext.
- FirstOrDefault, or First on ObjectQuery.
- Load on EntityCollection.
- Load on EntityReference.
- Any Language-Integrated Query (LINQ) method or ObjectQuery query builder method, such as Where, OrderBy, or Select.
什么时候关闭连接()
- 当数据库返回数据以后,
- 如果该数据已经被使用,或者被销毁,EF就会关闭数据库连接
- EF对象被销毁的时候
- 这个地方没有得到具体资料,实际测试一个连接关闭的非常快,可能一两秒就会关闭
如何处理多个数据库查询
当在单线程的环境中,EF会自动reopen数据库连接进行查询。在多线程的环境中,其他的线程在使用EF进行连接时,可能这个连接还处于connecting/close状态下,这个时候会导致一个数据库连接错误。
用户如何控制数据库连接?
在创建EF实例之前就创建连接,并且制定不让EF管理连接,如下:
using (var connection = ...) { using (var context = new TestDataContext(connection, false)) { ... } } |
可以输入一个“contextOwnsConnection”参数,来禁止EF管理数据库连接。
当然,这不是EF推荐的方法,因此默认生成的Gaia2Entities是没有这个方法的
共用EF的最佳实践?
从上述的资料看起来,有如下一些结论:
- 让EF管理数据库连接,除非对性能有特别的要求
- 尽可能不长时间地保留EF对象,MS推荐的方式是用完就丢
- 在多线程之间共享EF对象,为了安全,至少要加锁处理
- 要减少数据库查询,可以缓存数据,但不是缓存EF对象
关于EF的Bug
Don'tReuse Context with Entity Framework Self Tracking Entities
投递人 itwriter 发布于2012-05-01 15:22 评论(3) 有9364人阅读 原文链接 [收藏] « »
虽然 Entity Framework (EF) 5 承诺带来了超越 EF4 的大幅性能提升,但为了更有效地使用 ORM,我们仍然需要关注一些注意事项——即视图生成、缓存、自动编译的查询、查询执行选项及设计时(Design Time)。
微软已经发布了一份白皮书,概述使用待发布的 Entity Framework 5(它将作为即将到来的 .NET 4.5的一部分发布)时应关注的各种性能注意事项。
以下是一些需要注意的地方:
- 冷查询执行 vs. 暖查询执行(Cold-vs-Warm query execution)——视图生成这一步(用于从数据库模式到概念模式或从概念模式到数据模式的必要转换)会增加第一次运行查询时的开销,后续运行会因为视图缓存的缘故会更快一些。用户可以通过预生成视图来提升性能;
- 缓存——在对象层次(特别是结合禁用 AutoDetectChanges 改善 DbContext Find ()性能),可用的缓存有查询计划缓存(Query Plan Caching)、元数据缓存(MetaData Caching)及结果缓存(Results Caching)。EF 仍然没有提供二级缓存,不过我们可以参考一些指南进行实现——如 CodePlex 上的示例,以及 Julia Lerman 的文章“Entity Framework 与 Windows Azure 中的二级缓存”;
- 可选的无跟踪查询(没有状态跟踪的开销)。目前该选项只对 ObjectQuery 可用,没法适用于 DbSet 及 DbQuery 类;
- 微型 ORM 风格的快速查询,如数据库上执行 SQL 查询以及 ExecuteStoreQuery ;
- 设计时注意事项——每个层次对应一张表(Table-per-hierarchy,简称 TPH)vs. 每个类型对应一张表(Table-per-Type,简称 TPT)vs. 每个类对应一张表(Table-per-Class,简称 TPC);其中 TPT 在查询复杂度及性能方面表现最差;
- 延迟加载 vs. 预先加载 (Lazy-vs-Eager loading)。
Entity Framework 是由微软提供的一款面向 .NET 应用程序的商业对象关系映射框架。除了 EF 之外,.NET开发人员还可以选择的一些(开源和商业包括在内)产品有 NHibernate 和 LightSpeed。另外,还有一些轻量级的微型 ORM 模型像 Dapper.NET、PetaPoco 及 Massive。
Pastedfrom <http://news.cnblogs.com/n/140931/>