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

加入VIP,免费下载
 

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

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

下载须知

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

版权提示 | 免责声明

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

优雅地使用EntityFramework综述Word下载.docx

1、实体框架 使用这些基于 XML 的模型和映射文件将对概念模型中的实体和关系的创建、读取、更新和删除操作转换为数据源中的等效操作。EDM 甚至支持将概念模型中的实体映射到数据源中的存储过程。它提供以下方式用于查询 EDM 并返回对象:LINQ to Entities - 提供语言集成查询 (LINQ) 支持用于查询在概念模型中定义的实体类型。Entity SQL - 与存储无关的 SQL 方言,直接使用概念模型中的实体并支持诸如继承和关系等 EDM 功能。查询生成器方法 -可以使用 LINQ 风格的查询方法构造 Entity SQL 查询。下图演示用于访问数据的实体框架体系结构:1.1. ORM

2、的历史如何正确地选用钢材,既经济又能满足性能要求,以及正确选择热处理工艺。1.2. 开始使用Entity Framework图 11 端淬法测定示意图2. 创建实体模型2.1. 创建模型概述2.2. 使用Model First创建模型2.3. 使用Database 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.3.1. 使用Data Annotation配置3.3.2. 使用Fluent API配置3.4. 配置复杂类型的模型3.4.1. 如何使用复杂类型(Complex Type)3.4.2. 将实体映射到多个表(实体拆分)3.4.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、始化4.2.1. 设置Database的初始化器初始化器的介绍自定义初始化器从配置文件中设置Database的初始化器4.2.2. 手工控制Database的初始化4.2.3. 使用初始化器插入种子数据使用模型插入种子数据使用Sql脚本插入种子数据4.3. 使用DbContext4.3.1. DbContext简介4.3.2. DbContext与ObjectContext的关系ObjectContext 封装 .NET Framework 和数据库之间的连接。此类用作“创建”、“读取”、“更新”和“删除”操作的网关。 它是以对象(这些对象是概念模型中定义的实体类型的实例)的形式与数据进行交互

5、的主要类。ObjectContext 类的实例封装以下内容: 数据库的连接,以 EntityConnection 对象的形式封装。 描述该模型的元数据,以 MetadataWorkspace 对象的形式封装。 用于管理缓存中持久保存的对象的 ObjectStateManager 对象。成员参考:4.3.3. 自定义DbContext4.3.4. DbContext的生命周期4.3.5. DbContext对数据库连接的管理DbContext自动管理数据库连接4.3.6. DbContet的线程安全5. 查询数据5.1. POCO对象默认情况下,当你使用数据库优先或者模型优先开发方法的时候,你的

6、数据模型对象需要派生自 EntityObject 类,通过它提供 EF 功能。这意味着这些类不能是 持久性无感知(persistence ignorant ) 的,所以不能符合领域驱动开发的要求。所有的 EF 开发方法都支持使用 POCO 类,由于不需要派生自 EntityObject ,所以,这样的类是持久性无感知的。5.2. 模型实体的版本跟踪EF 通过比较实体的当前值与原始值来决定实体如何变化 ( 依此来决定发送到数据库的更新 )。在查询或者连接的时候原始值被保存起来。导致自动变化跟踪监测的一些方法如下: DbSet.Find DbSet.Local DbSet.Remove DbSet

7、.Add DbSet.Attach DbContext.SaveChanges DbContext.GetValidationErrors DbContext.EntryDbChangeTracker.Entries如果你跟踪大量的实体,而且在循环中多次调用上面提到的方法,通过使用 AutoDetectChangesEnabled 属性暂时关闭变化检测,可以得到显著的性能提升。Dont forget to re-enable detection of changes after the loop Weve used a try/finally to ensure it is always re

8、-enabled even if code in the loop throws an exception. An alternative to disabling and re-enabling is to leave automatic detection 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 ad

9、vanced and can easily introduce subtle bugs into your application so use them with care.5.2.1. 无跟踪查询Sometimes you may want to get 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 rea

10、d-only scenarios. The techniques shown in this topic apply equally to models created with Code First and the EF Designer.A new extension 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

11、blogs1 = context.Blogs.AsNoTracking(); / Query for some blogs without tracking them var blogs2 = context.Blogs .Where(b = b.Name.Contains(.NET) .AsNoTracking() .ToList();当数据库上下文从数据库获取数据行然后表示为实体的时候,默认情况下,会保持对内存中实体对象是否与数据库中数据同步的追踪。内存中的数据作为缓存,当你更新实体的时候被用来更新。这个缓存在 Web 应用程序中通常没有必要,因为上下文对象的实例生命期很短 ( 对于每一次

12、请求创建一个新的,然后释放 ) ,在实体被再次使用之前数据库上下文读取的实体对象已经被释放了。你可以通过 AsNoTracking 方法来指定上下文对象是否追踪实体对象。使用这个方法常见的场景如下: 对于查询大量数据的查询来说,关闭追踪可以提高性能。 你更希望重新连接一个对象用来更新,尽管基于不同的目的以前获取过同样的对象。由于数据库上下文已经追踪了这个实体,你就不能连接你希望修改的实体。防止出现这种情况的一种方式就是在原来的查询中使用 AsNoTracking 选项。Entity Framework Code First通过DbContext.ChangeTracker对实体对象的变动进行跟

13、踪,实现跟踪的方式有两种:变动跟踪快照和变动跟踪代理。变动跟踪快照:前面几篇随笔的示例都是通过实体对象变动快照跟踪来实现数据操作的,POCO模型不包含任何逻辑去通知Entity Framework实体类属性的变动。Entity Framework在第一次对象加载到内存中时进行一次快照,添加快照发生在返回一次查询或添加一个对象到DbSet中时。当Entity Framework需要知道对象的变动时,将先把当前实体与快照中的对象进行扫描对比。实现扫描对比的方法是调用DbContext.ChangeTracker的DetectChanges方法。变动跟踪代理:变动跟踪代理是一种会主动通知Entity

14、 Framework实体对象发生变动的机制。如:延迟加载的实现方式。要使用变动跟踪代理,需要在定义的类结构中,Entity Framework可以在运行时从POCO类中创建动态类型并重写POCO属性。动态代理就是一种动态类型,包含重写属性和通知Entity Framework实体对象变动的逻辑。Entity Framework之 Code First方式中能够自动调用DbContext.ChangeTracker.DetectChanges的方法: DbSet.Add DbSet.Find DbSet.Remove DbSet.Attach DbSet.Local DbContext.Save

15、Changes DbContext.GetValidationErrors DbContext.Entry DbChangeTracker.Entries 任何在DbSet上进行LINQ的查询1、控制什么时间调用DetectChanges大部分的实例对象的变动调整需要在Entity Framework进行SaveChanges时才会知道,但也可以根据需要调用变动跟踪获取当前对象的状态。Entity Framework Code First的DbContext.DetectChanges在检测实例对象的变动时,大部分情况不会有性能的问题。但当有大量的实例对象在内存中,或DbContext有大量的

16、操作时,自动的DetectChanges行为可能会一定程度的影响性能。Entity Framework提供关闭自动的DetectChanges的功能,在需要的时候进行手动调用。using (var ctx = new PortalContext()ctx.Configuration.AutoDetectChangesEnabled = false;var province = ctx.Provinces.Find(1); province.ProvinceName = 测试; Console.WriteLine(Before DetectChanges:0, ctx.Entry(provinc

17、e).State); ctx.ChangeTracker.DetectChanges();After DetectChanges:代码运行结果:UnchangedModified 2、获取不带变动跟踪的实体查询在一些情况下,我们只需要查询返回一个只读的数据记录,而不会对数据记录进行任何的修改。这种时候不希望Entity Framework进行不必要的状态变动跟踪,可以使用Entity Framework的AsNoTracking方法来查询返回不带变动跟踪的查询结果。5.3. 模型实体的代理对象为 POCO 实体类型创建实例时,实体框架常常为充当实体代理的动态生成的派生类型创建实例。此代理重写实

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

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

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

21、Create();如果要创建派生实体类型的实例,可使用 Create 的通用版本。 using (var context = new BloggingContext() var admin = context.Users.Create();请注意,Create 方法不将已创建的实体添加或附加到上下文。请注意,如果因为实体代理类型不执行任何操作而导致创建的实体代理类型不包含任何值,Create 方法将仅创建实体类型本身的实例。例如,如果实体类型已封装和/或没有虚拟属性,则 Create 将仅创建实体类型的实例。5.3.3. 从代理类型获取实际实体类型代理类型的名称类似如下所示:System.Da

22、ta.Entity.DynamicProxies.Blog_5E43C6C196972BF0754973E48C9C941092D86818CD94005E9A759B70BF6E48E6可通过使用 ObjectContext 中的 GetObjectType 方法,查找此代理类型的实体类型。 var blog = context.Blogs.Find(1); var entityType = ObjectContext.GetObjectType(blog.GetType();请注意,如果传递给 GetObjectType 的类型是非代理类型的实体类型的实例,则仍将返回实体的类型。这意味着,

23、始终可以使用此方法获取实际的实体类型,而不用再检查类型是否是代理类型。5.3.4. 代理类加载的前提The Entity Framework creates proxies for POCO entities if the classes meet the requirements described below. POCO entities can have proxy objects that support change tracking or lazy loading. You can have lazy loading proxies without meeting the requ

24、irements 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 by setting the LazyLoadingEnabled option to false.简单来说代理类是跟踪和懒加载的前提。For either of these proxies to be created: 代理类的前提 A cust

25、om 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 not be abstract (MustInherit in Visual Basic).不能是抽象类 A custom data class must have a public or protected constructor that doe

26、s 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 CreateObject 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