ImageVerifierCode 换一换
格式:DOCX , 页数:16 ,大小:98.37KB ,
资源ID:4083991      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bingdoc.com/d-4083991.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(优雅地使用EntityFramework综述.docx)为本站会员(b****4)主动上传,冰点文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰点文库(发送邮件至service@bingdoc.com或直接QQ联系客服),我们立即给予删除!

优雅地使用EntityFramework综述.docx

1、优雅地使用EntityFramework综述优雅地使用Entity Framework余志刚1. Entity Framework介绍最近在学习研究微软的EF,通过这时间的学习研究,感觉这个EF目前来说还不是很完善,半成品。不过,据说在.Net4.0中,微软将推荐使用此框架,并会有所改善。而且,现在基本上所有数据库均提供了对EF的支持。因此,为以后做技术准备可以学习研究以下。在.Net Framework SP1微软包含一个实体框架(Entity Framework),此框架可以理解成微软的一个ORM产品。用于支持开发人员通过对概念性应用程序模型编程(而不是直接对关系存储架构编程)来创建数据访

2、问应用程序。目标是降低面向数据的应用程序所需的代码量并减轻维护工作。Entity Framework 应用程序有以下优点:应用程序可以通过更加以应用程序为中心的概念性模型(包括具有继承性、复杂成员和关系的类型)来工作。应用程序不再对特定的数据引擎或存储架构具有硬编码依赖性。可以在不更改应用程序代码的情况下更改概念性模型与特定于存储的架构之间的映射。开发人员可以使用可映射到各种存储架构(可能在不同的数据库管理系统中实现)的一致的应用程序对象模型。多个概念性模型可以映射到同一个存储架构。语言集成查询支持可为查询提供针对概念性模型的编译时语法验证。实体框架Entity Framework 是 ADO

3、.NET 中的一组支持开发面向数据的软件应用程序的技术。在EF中的实体数据模型(EDM)由以下三种模型和具有相应文件扩展名的映射文件进行定义。概念架构定义语言文件 (.csdl) - 定义概念模型。存储架构定义语言文件 (.ssdl) - 定义存储模型(又称逻辑模型)。映射规范语言文件 (.msl) - 定义存储模型与概念模型之间的映射。实体框架 使用这些基于 XML 的模型和映射文件将对概念模型中的实体和关系的创建、读取、更新和删除操作转换为数据源中的等效操作。EDM 甚至支持将概念模型中的实体映射到数据源中的存储过程。它提供以下方式用于查询 EDM 并返回对象:LINQ to Entiti

4、es - 提供语言集成查询 (LINQ) 支持用于查询在概念模型中定义的实体类型。Entity SQL - 与存储无关的 SQL 方言,直接使用概念模型中的实体并支持诸如继承和关系等 EDM 功能。查询生成器方法 -可以使用 LINQ 风格的查询方法构造 Entity SQL 查询。下图演示用于访问数据的实体框架体系结构:1.1. ORM的历史如何正确地选用钢材,既经济又能满足性能要求,以及正确选择热处理工艺。1.2. 开始使用Entity Framework图 11 端淬法测定示意图2. 创建实体模型2.1. 创建模型概述2.2. 使用Model First创建模型2.3. 使用Databa

5、se First创建模型2.4. 使用Code First创建模型2.4.1. 数据库已存在情景下使用Code First创建模型2.4.2. 数据库不存在情景下使用Code First创建模型3. 配置实体模型3.1. 概述3.2. 配置实体的属性3.2.1. 使用Data Annotation配置3.2.2. 使用Fluent API配置3.3. 配置实体的关系3.3.1. 使用Data Annotation配置3.3.2. 使用Fluent API配置3.4. 配置复杂类型的模型3.4.1. 如何使用复杂类型(Complex Type)3.4.2. 将实体映射到多个表(实体拆分)3.4.

6、3. 将多个实体映射到一个表(表拆分)4. 使用EF管理Database4.1. 配置Database的位置4.1.1. 使用连接字符串配置4.1.2. 使用配置文件配置4.1.3. 使用连接字符串的名称配置4.1.4. 重用数据库链接4.1.5. 使用Connection Factory管理EF的数据库链接4.2. Database的初始化4.2.1. 设置Database的初始化器初始化器的介绍自定义初始化器从配置文件中设置Database的初始化器4.2.2. 手工控制Database的初始化4.2.3. 使用初始化器插入种子数据使用模型插入种子数据使用Sql脚本插入种子数据4.3. 使

7、用DbContext4.3.1. DbContext简介4.3.2. DbContext与ObjectContext的关系ObjectContext 封装 .NET Framework 和数据库之间的连接。此类用作“创建”、“读取”、“更新”和“删除”操作的网关。 它是以对象(这些对象是概念模型中定义的实体类型的实例)的形式与数据进行交互的主要类。ObjectContext 类的实例封装以下内容: 数据库的连接,以 EntityConnection 对象的形式封装。 描述该模型的元数据,以 MetadataWorkspace 对象的形式封装。 用于管理缓存中持久保存的对象的 ObjectSta

8、teManager 对象。成员参考:4.3.3. 自定义DbContext4.3.4. DbContext的生命周期4.3.5. DbContext对数据库连接的管理DbContext自动管理数据库连接4.3.6. DbContet的线程安全5. 查询数据5.1. POCO对象默认情况下,当你使用数据库优先或者模型优先开发方法的时候,你的数据模型对象需要派生自 EntityObject 类,通过它提供 EF 功能。这意味着这些类不能是 持久性无感知(persistence ignorant ) 的,所以不能符合领域驱动开发的要求。所有的 EF 开发方法都支持使用 POCO 类,由于不需要派生自

9、 EntityObject ,所以,这样的类是持久性无感知的。5.2. 模型实体的版本跟踪EF 通过比较实体的当前值与原始值来决定实体如何变化 ( 依此来决定发送到数据库的更新 )。在查询或者连接的时候原始值被保存起来。导致自动变化跟踪监测的一些方法如下: DbSet.Find DbSet.Local DbSet.Remove DbSet.Add DbSet.Attach DbContext.SaveChanges DbContext.GetValidationErrors DbContext.EntryDbChangeTracker.Entries如果你跟踪大量的实体,而且在循环中多次调用上

10、面提到的方法,通过使用 AutoDetectChangesEnabled 属性暂时关闭变化检测,可以得到显著的性能提升。Dont forget to re-enable detection of changes after the loop Weve used a try/finally to ensure it is always re-enabled even if code in the loop throws an exception. An alternative to disabling and re-enabling is to leave automatic detection

11、 of changes turned off at all times and either call context.ChangeTracker.DetectChanges explicitly or use change tracking proxies diligently. Both of these options are advanced and can easily introduce subtle bugs into your application so use them with care.5.2.1. 无跟踪查询Sometimes you may want to get

12、entities back from a query but not have those entities be tracked by the context. This may result in better performance when querying for large numbers of entities in read-only scenarios. The techniques shown in this topic apply equally to models created with Code First and the EF Designer.A new ext

13、ension method AsNoTracking allows any query to be run in this way. For example:using (var context = new BloggingContext() / Query for all blogs without tracking them var blogs1 = context.Blogs.AsNoTracking(); / Query for some blogs without tracking them var blogs2 = context.Blogs .Where(b = b.Name.C

14、ontains(.NET) .AsNoTracking() .ToList(); 当数据库上下文从数据库获取数据行然后表示为实体的时候,默认情况下,会保持对内存中实体对象是否与数据库中数据同步的追踪。内存中的数据作为缓存,当你更新实体的时候被用来更新。这个缓存在 Web 应用程序中通常没有必要,因为上下文对象的实例生命期很短 ( 对于每一次请求创建一个新的,然后释放 ) ,在实体被再次使用之前数据库上下文读取的实体对象已经被释放了。你可以通过 AsNoTracking 方法来指定上下文对象是否追踪实体对象。使用这个方法常见的场景如下: 对于查询大量数据的查询来说,关闭追踪可以提高性能。 你更希

15、望重新连接一个对象用来更新,尽管基于不同的目的以前获取过同样的对象。由于数据库上下文已经追踪了这个实体,你就不能连接你希望修改的实体。防止出现这种情况的一种方式就是在原来的查询中使用 AsNoTracking 选项。Entity Framework Code First通过DbContext.ChangeTracker对实体对象的变动进行跟踪,实现跟踪的方式有两种:变动跟踪快照和变动跟踪代理。变动跟踪快照:前面几篇随笔的示例都是通过实体对象变动快照跟踪来实现数据操作的,POCO模型不包含任何逻辑去通知Entity Framework实体类属性的变动。Entity Framework在第一次对象

16、加载到内存中时进行一次快照,添加快照发生在返回一次查询或添加一个对象到DbSet中时。当Entity Framework需要知道对象的变动时,将先把当前实体与快照中的对象进行扫描对比。实现扫描对比的方法是调用DbContext.ChangeTracker的DetectChanges方法。变动跟踪代理:变动跟踪代理是一种会主动通知Entity Framework实体对象发生变动的机制。如:延迟加载的实现方式。要使用变动跟踪代理,需要在定义的类结构中,Entity Framework可以在运行时从POCO类中创建动态类型并重写POCO属性。动态代理就是一种动态类型,包含重写属性和通知Entity

17、Framework实体对象变动的逻辑。Entity Framework之 Code First方式中能够自动调用DbContext.ChangeTracker.DetectChanges的方法: DbSet.Add DbSet.Find DbSet.Remove DbSet.Attach DbSet.Local DbContext.SaveChanges DbContext.GetValidationErrors DbContext.Entry DbChangeTracker.Entries 任何在DbSet上进行LINQ的查询1、控制什么时间调用DetectChanges大部分的实例对象的变

18、动调整需要在Entity Framework进行SaveChanges时才会知道,但也可以根据需要调用变动跟踪获取当前对象的状态。Entity Framework Code First的DbContext.DetectChanges在检测实例对象的变动时,大部分情况不会有性能的问题。但当有大量的实例对象在内存中,或DbContext有大量的操作时,自动的DetectChanges行为可能会一定程度的影响性能。Entity Framework提供关闭自动的DetectChanges的功能,在需要的时候进行手动调用。using (var ctx = new PortalContext()ctx.C

19、onfiguration.AutoDetectChangesEnabled = false;var province = ctx.Provinces.Find(1); province.ProvinceName = 测试; Console.WriteLine(Before DetectChanges:0, ctx.Entry(province).State); ctx.ChangeTracker.DetectChanges(); Console.WriteLine(After DetectChanges:0, ctx.Entry(province).State);代码运行结果:Before D

20、etectChanges:UnchangedAfter DetectChanges:Modified 2、获取不带变动跟踪的实体查询在一些情况下,我们只需要查询返回一个只读的数据记录,而不会对数据记录进行任何的修改。这种时候不希望Entity Framework进行不必要的状态变动跟踪,可以使用Entity Framework的AsNoTracking方法来查询返回不带变动跟踪的查询结果。5.3. 模型实体的代理对象为 POCO 实体类型创建实例时,实体框架常常为充当实体代理的动态生成的派生类型创建实例。此代理重写实体的某些虚拟属性,这样可在访问属性时插入挂钩,从而自动执行操作。例如,此机制用

21、于支持关系的延迟加载。当 EF 创建实体对象的时候 ( 例如,在执行查询的时候 ),EF 经常会创建动态生成的派生自实体的代理对象。代理重写了实体的虚拟属性来插入在访问属性的时候自动执行的钩子。例如,这种机制用来支持延迟加载或者关联。多数时候你并不能察觉使用了代理,除了下面的情况之外:有一些场景,你需要阻止 EF 创建代理实例。例如,序列化非代理的对象实例可能比序列化代理对象实例更加有效。当使用 new 操作符实例化实体的时候,你并没有得到代理实例。这意味着你不能获得诸如延迟加载以及自动追踪的能力。一般没有问题,通常并不需要延迟加载,因为你在创建数据库中并不存在的实体。在将实体标记为 Adde

22、d 状态的时候,也不需要追踪。然而,如果你需要延迟加载,需要改变追踪,就可以通过 DbSet 类的 Create 方法来创建实体代理对象。可能需要通过代理类型对象实例获取真实实体类型。可以使用 ObjectContext 类的 GetObjectType 方法来通过代理对象获取实际对象。5.3.1. 禁用代理有时需要禁止实体框架创建代理实例。例如,人们通常认为序列化非代理实例要比序列化代理实例容易得多。可通过清除 ProxyCreationEnabled 标记来关闭代理创建功能。上下文的构造函数便是可执行此操作的一个位置。例如:public class BloggingContext : Db

23、Context public BloggingContext() this.Configuration.ProxyCreationEnabled = false; public DbSet Blogs get; set; public DbSet Posts get; set; 请注意,在无需代理执行任何操作的情况下,EF 不会为类型创建代理。这意味着,也可以通过使用封装和/或没有虚拟属性的类型,避免生成代理。有时需要禁止实体框架创建代理实例。例如,人们通常认为序列化非代理实例要比序列化代理实例容易得多。可通过清除 ProxyCreationEnabled 标记来关闭代理创建功能。上下文的构造

24、函数便是可执行此操作的一个位置。例如:public class BloggingContext : DbContext public BloggingContext() this.Configuration.ProxyCreationEnabled = false; public DbSet Blogs get; set; public DbSet Posts get; set; 请注意,在无需代理执行任何操作的情况下,EF 不会为类型创建代理。这意味着,也可以通过使用封装和/或没有虚拟属性的类型,避免生成代理。5.3.2. 显式创建代理实例通过使用 DbSet 的 Create 方法执行此操

25、作。例如:using (var context = new BloggingContext() var blog = context.Blogs.Create(); 如果要创建派生实体类型的实例,可使用 Create 的通用版本。例如: using (var context = new BloggingContext() var admin = context.Users.Create(); 请注意,Create 方法不将已创建的实体添加或附加到上下文。请注意,如果因为实体代理类型不执行任何操作而导致创建的实体代理类型不包含任何值,Create 方法将仅创建实体类型本身的实例。例如,如果实体类

26、型已封装和/或没有虚拟属性,则 Create 将仅创建实体类型的实例。5.3.3. 从代理类型获取实际实体类型代理类型的名称类似如下所示:System.Data.Entity.DynamicProxies.Blog_5E43C6C196972BF0754973E48C9C941092D86818CD94005E9A759B70BF6E48E6可通过使用 ObjectContext 中的 GetObjectType 方法,查找此代理类型的实体类型。例如:using (var context = new BloggingContext() var blog = context.Blogs.Find

27、(1); var entityType = ObjectContext.GetObjectType(blog.GetType(); 请注意,如果传递给 GetObjectType 的类型是非代理类型的实体类型的实例,则仍将返回实体的类型。这意味着,始终可以使用此方法获取实际的实体类型,而不用再检查类型是否是代理类型。5.3.4. 代理类加载的前提The Entity Framework creates proxies for POCO entities if the classes meet the requirements described below. POCO entities can

28、 have proxy objects that support change tracking or lazy loading. You can have lazy loading proxies without meeting the requirements for change tracking proxies, but if you meet the change tracking proxy requirements, then the lazy loading proxy will be created as well. You can disable lazy loading

29、by setting the LazyLoadingEnabled option to false.简单来说代理类是跟踪和懒加载的前提。For either of these proxies to be created: 代理类的前提 A custom data class must be declared with public access.必须是开放(public)申明 A custom data class must not be sealed (NotInheritable in Visual Basic) 不能是sealed申明 A custom data class must n

30、ot be abstract (MustInherit in Visual Basic).不能是抽象类 A custom data class must have a public or protected constructor that does not have parameters. Use a protected constructor without parameters if you want the CreateObject method to be used to create a proxy for the POCO entity. Calling the CreateOb

31、ject method does not guarantee the creation of the proxy: the POCO class must follow the other requirements that are described in this topic. 必须有无参的构造函数 The class cannot implement the IEntityWithChangeTracker or IEntityWithRelationships interfaces because the proxy classes implement these interfaces. 不能继承自这两

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2