使用对象(实体框架)
利用实体框架 ,您可以查询、插入、更新和删除数据,它表示为作为实体类型实例的类型化的公共语言运行时 (CLR) 对象。 实体类型表示概念模型中定义的实体。 实体框架 将概念模型中定义的实体和关系映射到数据源。 利用实体框架 可执行以下操作:将从数据源返回的数据具体化为对象;跟踪对对象所做的更改;处理并发;将对象更改传播到数据源;以及将对象绑定到控件。 可以使用LINQ to Entities、Entity SQL 语言或查询生成器方法(实体框架)对概念模型执行查询。 有关更多信息,请参见查询概念模型(实体框架)。
ObjectContext 类是用于与实体对象进行交互的主类。 ObjectContext 类的实例封装以下各项:数据库的连接;描述模型的元数据;以及一个 ObjectStateManager 对象,此对象用于在创建、更新和删除操作期间跟踪对象。 有关更多信息,请参见标识解析、状态管理和更改跟踪(实体框架)。
实体框架 提供了可根据概念模型自动生成对象层的工具。 对象层包括实体类型和对象上下文定义。 对象上下文定义包含一个 ObjectContext 派生类,此类通常具有一组返回指定类型的实体集合的属性。 若要生成对象层代码,请使用Entity Data Model Designer(实体设计器)或 EdmGen.exe 命令行工具。 有关更多信息,请参见Generated Code Overview。
实体类型
在实体框架 中,您可以使用派生自 EntityObject 的实体类型、“纯旧式”CLR 对象 (POCO) 类型、POCO 代理类型和自跟踪实体类型。 以下各节提供了一些信息,可帮助您在给定应用程序的特性的情况下决定适用的选项。
EntityObject
默认情况下,ADO.NET 实体数据模型 工具生成 EntityObject 派生实体类型。 在使用 EntityObject 派生类型时,对象上下文可管理对象之间的关系,在更改发生时对其进行跟踪并以最有效的方式支持延迟加载。 不过,EntityObject 派生类型对实体框架 有较大的依赖。 如果使用的体系结构要求持久性未知(例如,测试驱动开发或域驱动开发)或您现已具有域类,请考虑使用 POCO 或 POCO 代理。
POCO
利用实体框架 ,您可以将现有域对象与数据模型一起使用,而无需对数据类进行任何修改。 这些 POCO 数据类(也称为“永久性未知对象”)支持与实体数据模型 工具生成的实体类型相同的大多数查询、插入、更新和删除行为。
如果使用的是 POCO 类型,则在对对象图进行更改时,实体框架 不会自动跟踪所做的更改。 实体框架 使用快照机制来检测对对象所做的更改。 调用 DetectChanges 可将对象上下文与图同步。 默认情况下,对象上下文先调用此方法,然后再将数据保存到数据源。 此机制使用的内存多于即时通知机制使用的内存,并且会影响性能,特别是在应用程序需要经常检测更改时。 有关更多信息,请参见跟踪 POCO 实体中的更改(实体框架)。 若要获得即时通知支持,请启用更改跟踪代理对象的创建。
若要利用延迟加载,您需要启用延迟加载代理的创建。 有关更多信息,请参见下面的“POCO 代理”一节。
POCO 代理
如果需要非常有效且即时的更改跟踪和延迟加载,请使用 POCO 代理。 在使用代理时,虽然您可以使用与 EntityObject 派生类型相同的功能,但仍从实体框架 中分离域类。 若要启用延迟加载代理和/或即时更改跟踪代理的创建,则 POCO 类必须符合 创建 POCO 代理的要求(实体框架)这一主题中描述的要求。
代理是在运行时期间创建的,并从 POCO 类型继承。 这表示实体的运行时类型不同于 POCO 类型。 这将使序列化变得复杂一些。 有关更多信息,请参见使用 POCO 实体(实体框架)。 请注意,与 POCO 类型相比,创建代理类型会产生一些开销。
自跟踪实体
EntityObject 派生类型、POCO 和 POCO 代理类型可在一些应用程序中正常工作,在这些应用程序中,可以将实体对象附加到处理更改跟踪的对象上下文。 但是,在必须将实体的全图传送给一个层时,如果对象上下文不可用,则必须确定如何跟踪更改并将这些更改报告回对象上下文。 从 .NET Framework 版本 4 开始,自跟踪实体可记录对标量属性、复杂属性和导航属性所做的更改。 自跟踪实体不依赖于实体框架 。 **“ADO.NET 自跟踪实体生成器”**模板可生成自跟踪实体。 有关更多信息,请参见使用自跟踪实体。
性能注意事项
下面的性能注意事项还可以帮助您选择最适用于应用程序的对象类型。
在加载元数据时,发现 POCO 或代理类型产生的成本高于发现特性化的 EntityObject 派生类型产生的成本。
生成动态 POCO 代理类型时会产生一些开销。
与代理和 EntityObject 派生类型相比,初始化 POCO 类型产生的开销最小。
POCO 快照跟踪的成本高于即时通知跟踪的成本。