65.9K
CodeProject 正在变化。 阅读更多。
Home

使用 Self-Tracking Entity Generator 构建 WPF 应用程序 - 项目设置

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.80/5 (11投票s)

2011 年 12 月 7 日

CPOL

10分钟阅读

viewsIcon

79570

downloadIcon

4794

本文描述了使用自跟踪实体生成器为 WPF/Silverlight 构建 WPF 示例应用程序的项目设置。

目录

引言

在本文中,我们将介绍一款名为“自跟踪实体生成器 for WPF/Silverlight”的新 Visual Studio 2010 扩展,并以使用此扩展构建的演示应用程序 SchoolSample 为例进行介绍。在开始之前,让我们先看一下该扩展的主要功能。

  • 为所有实体类自动生成 IClientChangeTracking 接口实现,这些实体类通过每个实体对象提供客户端更改跟踪。该接口包含 AcceptChanges()RejectChanges()HasChangesGetObjectGraphChanges() 等方法和属性。
  • 为所有 WPF 实体类自动生成 IDataErrorInfo 接口实现,以及/或者为所有 Silverlight 实体类自动生成 INotifyDataErrorInfo 接口实现。
  • 自动生成由 Portable Extensible Metadata for Entity Framework 创建的显示和验证属性,以及一个通过源代码添加自定义验证逻辑的基础结构。
  • 可选地为所有实体类自动生成 IEditableObject 接口实现,这些实体类提供将对象所做的更改提交或回滚到用作数据源的这些对象的功能。

通过这些自动生成的客户端更改跟踪和多级验证支持等功能,以及通过 Windows Identity Foundation (WIF) 进行的身份验证和授权,我们应该能够更快速地构建 WPF LOB 应用程序。

然而,这并不意味着我们可以使用自跟踪实体开发任何类型的 WPF 应用程序。首先,使用自跟踪实体通常意味着我们需要同时开发支持 Microsoft .NET 4.0 及更高版本的客户端和服务器程序集。对于非 .NET 客户端,创建跟踪行为和使用使用自跟踪实体构建的 WCF 服务是一个很大的障碍。

另一个限制是我们需要在客户端和服务器端共享完整的实体类。在不希望将实体所有属性都发送到客户端的情况下,我们可能需要开发一个部分数据模型使用自跟踪实体,其余部分使用 DTO 类的应用程序。

演示应用程序

演示应用程序 SchoolSample 是一个使用 MVVM (MVVM Light Toolkit)、自跟踪实体生成器 for WPF/Silverlight 和 MEF 构建的 WPF 应用程序。这个简单的应用程序允许用户添加/删除/更新学生、讲师或课程及其注册信息。保存按钮保存当前所选项目的更改,取消按钮取消对该项目所做的任何更改。保存所有按钮会循环遍历整个列表并保存每个项目的更改,取消所有按钮会循环遍历并取消所有项目的更改。此示例未展示如何使用 WIF 进行身份验证和授权。有关 WIF 的信息,您可以查阅 Vittorio Bertocci 的书籍《Programming Windows Identity Foundation》。

系统要求

为了构建演示应用程序,我们需要:

支持的操作系统

  • Windows Vista SP2、Windows Server 2008 SP2、Windows 7 或 Windows Server 2008 R2
  • Windows XP SP3 或 Windows Server 2003 R2 SP2(需遵循 下方 特殊说明)

其他要求

  • Microsoft SQL Server 2005、2008 或 2008 R2
  • Microsoft Visual Studio 2010 Professional SP1
  • 自跟踪实体生成器 for WPF/Silverlight (VS2010 扩展)
  • MVVM Light Toolkit V3 SP1(包含在示例解决方案中)
  • (可选) Tangible T4 Editor plus modeling tools for VS2010 (VS2010 扩展)

安装

下载演示应用程序源代码到本地磁盘后,我们需要完成以下两步:

安装 VS2010 扩展

首先,我们需要从项目站点的下载部分下载自跟踪实体生成器 for WPF/Silverlight 安装程序。解压其内容,然后运行安装包。

此 Visual Studio 扩展安装程序会将两个扩展添加到 Visual Studio 2010 SP1 中,您可以通过“工具”->“扩展管理器...”进行验证,如下图所示。

第一个 Visual Studio 扩展 C# Self-Tracking Entity Generator for WPF and SL 是一个 C# Entity Framework 项目项,用于为 WPF/Silverlight 应用程序生成自跟踪实体类。另一个扩展 Portable Extensible Metadata 是 Microsoft 的免费下载,您也可以在此单独获取。

安装示例数据库

要安装演示数据库,请运行源代码下载中包含的 SQL 脚本 *School.sql*。此脚本将创建我们演示应用程序所需的 SCHOOL 数据库架构。

构建和运行示例

完成以上两个安装步骤后,我们就可以开始构建和运行演示应用程序了。请仔细检查项目 *SchoolSample.Wcf* 中的 *Web.config* 文件的 connectionStrings 是否指向您新创建的数据库。当前设置为:

<connectionStrings>
<add name="SchoolEntities" connectionString="metadata=res://
*/EntityModel.SchoolModel.csdl|res://*/EntityModel.SchoolModel.ssdl|res://
*/EntityModel.SchoolModel.msl;provider=System.Data.SqlClient;
provider connection string=&quot;data source=localhost;initial catalog=SCHOOL;
integrated security=True;multipleactiveresultsets=True;App=EntityFramework&quot;" 
providerName="System.Data.EntityClient" />
</connectionStrings>

当演示编译并成功运行时,我们应该可以看到此 WPF 应用程序运行,如下面的截图所示。

架构

解决方案结构

在演示的解决方案文件中,项目被组织到几个解决方案文件夹中。*Client* 文件夹包含所有最终构建并作为客户端 WPF 演示应用程序运行的项目。而 *Server* 文件夹则包含所有提供 WCF 服务并在 Web 服务器环境中运行的项目。接下来,让我们简要介绍每个项目的主要功能。

对于 Server 文件夹中的项目:

  • 项目 *SchoolSample.Data.Wcf* 包含服务器端自动生成的DataAccess实体类,以及每个实体类的自定义验证逻辑。
  • 项目 *SchoolSample.Wcf* 是主要的服务器端项目,包含 WCF 服务类,它通过项目 *SchoolSample.Data.Wcf* 中的DataAccess实体类来查询和更新 SCHOOL 数据库。

对于 Client 文件夹中的项目:

  • 项目 *SchoolSample.Common* 包含所有在其他客户端项目之间共享的通用类和接口。
  • 项目 *SchoolSample.Data* 是项目 *SchoolSample.Data.Wcf* 的客户端对应项,包含自动生成的自跟踪实体类,以及每个实体类的自定义验证逻辑。
  • 项目 *SchoolSample.WCFService* 包含项目 *SchoolSample.Wcf* 中的 *SchoolService* 类的服务代理类。
  • 项目 *SchoolSample.Model* 定义了此演示应用程序的所有 ViewModel 类都需要用到的 SchoolModel 类。
  • 项目 *SchoolSample.ViewModel* 包含以下所有 ViewModel 类:
    • MainPageViewModel
    • StudentPageViewModel
    • InstructorPageViewModel
    • CoursePageViewModel
  • 项目 *SchoolSample* 是主要的客户端项目,也负责承载所有 UI 逻辑。

项目 SchoolSample.Data.Wcf

接下来,让我们仔细看看服务器端DataAccess层项目 *SchoolSample.Data.Wcf*。

文件夹 *EntityModel* 包含 ADO.NET Entity Data Model EDM 文件以及由自跟踪实体生成器 for WPF/Silverlight 创建的三个 T4 模板文件。文件夹 *Validation* 则包含在实体类上定义的所有自定义验证逻辑。

要添加这三个 T4 模板文件,我们需要先打开 *SchoolModel.edmx* 文件,然后右键单击并选择“添加代码生成项...”。

接下来,我们会看到“添加新项”对话框。选择“自跟踪实体生成器 for WPF/Silverlight”,在“名称”字段中键入“SchoolDataModel.tt”,然后点击“添加”按钮。

这将带我们进入第二个对话框,在此我们需要输入实体类命名空间“SchoolSample.EntityModel”,选择是否可选地生成 IEditableObject 接口,以及是否为 WPF、Silverlight 或两者都生成代码。点击“确定”后,将创建三个 T4 模板文件,这些 T4 模板文件将基于 *SchoolModel.edmx* 自动生成所有自跟踪实体类。

项目 SchoolSample.Data

项目 *SchoolSample.Data* 包含客户端自动生成的自跟踪实体类以及每个实体类的自定义验证逻辑。

此项目要做的第一件事是为所有配置设置一个条件编译符号 *WPF*,如下所示:

文件夹 *EntityModel* 包含对项目 *SchoolSample.Data.Wcf* 中 *SchoolDataModel.Client.tt* 和 *SchoolDataModel.tt* 文件的链接。文件夹 *Validation* 包含对项目 *SchoolSample.Data.Wcf* 同一 *Validation* 文件夹下的所有文件的链接。我们可以轻松地添加链接,如下图所示:

关于这两个客户端 T4 模板文件的最后一个说明是,每当 *SchoolModel.edmx* 文件发生更改时,请务必点击“运行自定义工具”,以便客户端实体类也能得到更新。

Windows XP 设置

不幸的是,由于文件夹名称长度限制,自跟踪实体生成器 for WPF/Silverlight 无法在 Windows XP 机器上安装。要在 Windows XP 上构建具有相同功能的 WPF 应用程序,我们需要手动执行一些步骤。首先,以下是所需条件列表:

  • Microsoft SQL Server 2005、2008 或 2008 R2
  • Microsoft Visual Studio 2010 Professional SP1
  • Portable Extensible Metadata (VS2010 扩展)
  • (可选) Tangible T4 Editor plus modeling tools for VS2010 (VS2010 扩展)

要创建类似于 *SchoolSample.Data.Wcf* 的新项目,我们首先需要添加一个 ADO.NET Entity Data Model 项,并将其“代码生成策略”设置为“无”。

之后,将 *SchoolSample.Data.Wcf* 项目中的三个 T4 模板文件添加到此新项目中,并将它们重命名为您喜欢的任何名称。对于 *SchoolDataModel.tt*,将“inputFile”值设置为新 EDM 文件所在的位置,并将“namespaceName”设置为您选择的新命名空间。

对于 *SchoolDataModel.Context.tt*,将“inputFile”和“namespaceName”值设置如上。

对于 *SchoolDataModel.Client.tt*,除了设置“inputFile”和“namespaceName”值(如上)之外,我们还需要设置“codeForSilverlight”、“codeForWPF”和“codeForIEditableObject”的值。

之后,我们只需要右键单击这三个 T4 模板文件中的每个文件,然后选择“运行自定义工具”。这将根据我们新的 EDM 文件生成所有自跟踪实体类。

在为 Windows XP 创建类似于 *SchoolSample.Data* 的新项目时,没有特殊的步骤需要遵循。只需按照 项目 SchoolSample.Data 部分中的说明进行操作即可。

Entity Framework 4.0 的问题

在 Microsoft .NET 4.0 下运行演示时存在一个问题。要重现此问题,我们首先需要添加几个新学生、讲师和两门新课程。然后,将学生注册到这两门新课程中并保存所有更改。对于这两个步骤,我们应该不会遇到任何问题。之后,选择一个已注册这两门新课程的学生,尝试删除这两个注册信息,然后保存所有更改。我们将看到类似下图所示的警告消息。

事实上,这是 Entity Framework 4.0 的一个 bug,如此处(SQL 应用程序中的主实体在使用 .NET Framework 4 中的 Entity Framework 时会生成不必要的更新)所述,我们可以使用 SQL Server Profiler 轻松捕获此问题,如下所示:

由于我们只是删除注册信息,因此对 Course 和 Person 实体的更新都是不必要的。而且,由于演示应用程序使用了 Concurrency Mode=Fixed,第一次删除/更新会错误地阻止第二次删除/更新的执行。

为了在生产系统中解决此问题,我们需要联系 Microsoft 支持部门获取热修复程序(尽管该热修复程序已可用,但并非免费)。对于个人测试目的,我们可以构建一个带有 Microsoft Entity Framework June 2011 CTP 的虚拟机,该 CTP 也修复了此问题。下图显示了此演示应用程序与 Entity Framework June 2011 CTP 一起运行,我们可以看到删除注册信息不会触发对 Course 和 Person 实体的两次更新。保存所有更改将顺利进行。

总结

在本文中,我们介绍了 Visual Studio 2010 扩展“自跟踪实体生成器 for WPF/Silverlight”,以及设置环境以构建和运行 SchoolSample 演示应用程序的所有必要步骤。

希望您觉得本文有用,请在下方评分和/或留下反馈。谢谢!

历史

  • 2011 年 12 月 7 日 - 初始发布。
  • 2012 年 1 月 19 日 - 更新了源代码。
  • 2012 年 2 月 20 日 - 更新了源代码。
© . All rights reserved.