迁移注意事项(实体框架)

现有的应用程序可以从多方面受益于 ADO.NET 实体框架。其中最重要的益处之一在于能够使用实体数据模型 (EDM) 将应用程序使用的数据结构与数据源中的架构分离。这样,日后便可轻松地对存储模型或数据源本身进行更改,而无需对应用程序进行补偿更改。有关使用实体框架的益处的更多信息,请参见实体框架简介

为了利用实体框架的益处,您可以将现有应用程序迁移到实体框架。某些任务对于所有迁移的应用程序是通用的。这些通用任务包括升级应用程序以使用 .NET Framework 3.5 Service Pack 1 (SP1)、定义 EDM 以及配置实体框架。在将应用程序迁移至实体框架时,还需要考虑其他一些注意事项。相关注意事项取决于要迁移的应用程序的类型及具体功能。本主题提供的信息可帮助您为现有应用程序选择最佳的升级途径。

有关迁移的一般注意事项

在将任何应用程序迁移到实体框架时,需要考虑以下注意事项:

  • 使用 .NET Framework 3.5 的任何应用程序都可以迁移至实体框架,只要该应用程序使用的数据源的数据提供程序支持实体框架即可。

  • 即使某个数据源提供程序支持实体框架,实体框架也可能不支持该提供程序的所有功能。

  • 对于大型或复杂的应用程序,不需要一次性地将整个应用程序迁移到实体框架。但是,在数据源发生更改时,仍然需要更改应用程序中不使用实体框架的任何部分。

  • 应用程序的其他部分可以共享实体框架所用的数据提供程序连接,因为实体框架使用 ADO.NET 数据提供程序访问数据源。例如,实体框架使用 SqlClient 提供程序访问 SQL Server 数据库。有关更多信息,请参见用于实体框架的 EntityClient 提供程序

通用迁移任务

将现有应用程序迁移到实体框架的途径取决于应用程序的类型以及现有的数据访问策略。但是,在将现有应用程序迁移到实体框架时,总是要执行以下任务。

Note注意

当您在 Visual Studio 2008 中使用实体数据模型工具时,将自动执行所有这些任务。有关更多信息,请参见如何:使用实体数据模型向导(实体框架)

  1. 升级应用程序。

    使用早期版本 Visual Studio 和 .NET Framework 创建的项目必须升级为使用 Visual Studio 2008 SP1 和 .NET Framework 3.5 SP1。有关更多信息,请参见 Visual Studio 转换向导

  2. 定义实体数据模型 (EDM)。

    EDM 定义概念模型中的实体、数据源中的结构(如表、存储过程和视图)以及实体与数据源结构之间的映射。有关更多信息,请参见如何:手动定义实体数据模型(实体框架)

    在存储模型中定义的类型必须与数据源中对象的名称相匹配。如果现有应用程序将数据作为对象公开,则必须确保在概念模型中定义的实体和属性与这些现有数据类和属性的名称相匹配。有关更多信息,请参见如何:自定义实体数据模型以使用自定义对象(实体框架)

    Note注意

    可以使用实体数据模型设计器重命名概念模型中的实体以匹配现有对象。有关更多信息,请参见 ADO.NET 实体数据模型设计器概述

  3. 定义连接字符串。

    实体框架在对 EDM 执行查询时使用特殊格式的连接字符串。此连接字符串封装有关 EDM 映射文件和到数据源的连接的信息。有关更多信息,请参见如何:定义连接字符串(实体框架)

  4. 配置 Visual Studio 项目。

    必须将对实体框架程序集和 EDM 的引用添加到 Visual Studio 项目。可以将这些映射文件添加到项目中,以确保这些文件随应用程序一起部署在连接字符串中所指示的位置。有关更多信息,请参见如何:手动配置实体框架项目

有关包含现有对象的应用程序的注意事项

在将应用程序迁移到实体框架时,迁移现有数据类的方式取决于在这些类中实现的业务逻辑、自定义方法和属性验证。应选择以下方式之一来处理现有数据类。

  • 如果数据类仅获取和设置对象属性,请使用由实体数据模型工具生成的实体类型替换现有数据类。有关更多信息,请参见如何:使用实体数据模型向导(实体框架)

  • 如果数据类实现自定义验证代码或其他业务逻辑,请将此逻辑迁移到由实体数据模型工具生成的分部类中。实体数据模型工具以分部类的形式生成实体类型。这使您可以通过将现有类转换为分部类来重复使用方法和属性。在这样处理时,必须将生成的类中的任何重复属性从现有应用程序中移除。有关如何创建分部类的更多信息,请参见自定义对象(实体框架)

    对于数据类的每个属性,实体框架工具均会生成名为 On属性名称ChangingOn属性名称Changed 的分部方法。可以将现有属性验证代码移入这些分部方法中。有关更多信息,请参见如何:在属性更改过程中执行业务逻辑(实体框架)

  • 如果现有数据类中有大量自定义代码,或由于其他原因而希望保留现有数据类,则应执行以下操作之一:

    • 将数据类修改为从 EntityObjectComplexObject 类继承。所有生成的 EDM 类型都继承自 EntityObjectComplexObject,而实体框架使您可以通过从这些基类继承来使用自定义数据类。这是将自定义数据类用于 EDM 的推荐方法。有关更多信息,请参见自定义对象(实体框架)

    • 修改数据类以实现一组接口。如果数据类无法从 EntityObjectComplexObject 继承,则可以这样做。有关如何实现这些接口的更多信息,请参见自定义对象(实体框架)

Note注意

在将现有数据类或分部类用于 EDM 时,类名必须与概念模型中定义的实体名称相匹配。可使用实体设计器重命名实体。有关更多信息,请参见如何:创建和修改实体类型

有关使用 ADO.NET 提供程序的应用程序的注意事项

使用 ADO.NET 提供程序(如 SqlClient)可以查询数据源以返回表格格式数据。还可以将数据加载到 ADO.NET 数据集中。下表介绍在升级使用现有 ADO.NET 提供程序的应用程序时的注意事项:

  • 使用数据读取器显示表格格式数据。
    可以考虑使用 EntityClient 提供程序执行 Entity SQL 查询,并对返回的 EntityDataReader 对象进行枚举。仅当应用程序使用数据读取器显示表格格式数据,且不需要由对象服务提供用于将数据具体化为对象、跟踪更改和进行更新的功能时,才应这样做。可以继续使用对数据源进行更新的现有数据访问代码,但可以使用从 EntityConnectionStoreConnection 属性访问的现有连接。有关更多信息,请参见 用于实体框架的 EntityClient 提供程序
  • 使用数据集。
    在实体框架中,对象服务提供的许多功能与数据集提供的功能相同,例如内存中持久性、更改跟踪、数据绑定以及将对象序列化为 XML 数据。有关更多信息,请参见对象服务概述(实体框架)

    如果对象服务未提供应用程序所需的数据集功能,仍然可以通过使用 LINQ to DataSet 来利用 LINQ 查询的优点。有关更多信息,请参见 LINQ to DataSet

有关将数据绑定到控件的应用程序的注意事项

.NET Framework 使您可以封装数据源(如数据集或 ASP.NET 数据源控件)中的数据,然后将用户界面元素绑定到这些数据控件。下表介绍将控件绑定到实体框架数据时的注意事项。

  • 将数据绑定到控件。
    在查询 EDM 时,对象服务以作为实体类型实例的对象的形式返回数据。这些对象可以直接绑定到控件,此绑定支持更新。这意味着对控件中的数据(如 DataGridView 中的行)所做的更改会在调用 SaveChanges 方法时自动保存到数据库。

    如果应用程序对查询结果进行枚举,以在 DataGridView 或支持数据绑定的其他类型的控件中显示数据,则可以修改应用程序以将该控件绑定到 ObjectQuery 的结果。

    有关更多信息,请参见将对象绑定到控件(实体框架)

  • ASP.NET 数据源控件。
    实体框架包含一个数据源控件,该控件旨在简化 ASP.NET Web 应用程序中的数据绑定。有关更多信息,请参见实体框架数据源控件

其他注意事项

以下是在将特定类型的应用程序迁移到实体框架时可能需要考虑的一些注意事项。

  • 公开数据服务的应用程序。
    基于 Windows Communication Foundation (WCF) 的 Web 服务和应用程序使用 XML 请求/响应消息格式公开基础数据源中的数据。实体框架使用二进制、XML 或 WCF 数据约定序列化支持实体对象的序列化。二进制和 WCF 序列化都支持对象图的整体序列化。有关更多信息,请参见 Web 服务和实体数据模型(应用程序方案)
  • 使用 XML 数据的应用程序。
    通过对象序列化可以创建实体框架数据服务。这些服务为使用 XML 数据的应用程序(如基于 AJAX 的 Internet 应用程序)提供数据。在这类情况下,请考虑使用 ADO.NET 数据服务。这些数据服务基于 EDM,并使用标准具象状态传输 (REST) HTTP 操作(如 GET、PUT 和 POST)提供对实体数据的动态访问。有关更多信息,请参见 ADO.NET 数据服务框架

    实体框架不支持本机 XML 数据类型。这意味着在将实体映射到包含 XML 列的表时,该 XML 列的等效实体属性是一个字符串。对象可以断开连接,并序列化为 XML。有关更多信息,请参见序列化对象(实体框架)

    如果应用程序需要查询 XML 数据,则仍然可以通过使用 LINQ to XML 来利用 LINQ 查询的优点。有关更多信息,请参见 LINQ to XML

  • 维护状态的应用程序。
    ASP.NET Web 应用程序需要经常维护网页或用户会话的状态。可以在客户端视图状态或服务器上的会话状态中存储 ObjectContext 实例中的对象,并在以后检索这些对象并将其重新附加到新的对象上下文。有关更多信息,请参见附加对象(实体框架)

另请参见

概念

部署注意事项(实体框架)
实体框架术语

其他资源

实体框架任务