使用 Microsoft 桌面技术栈 - 第一部分:为私有部署设置 SQL Compact 4.0






4.86/5 (24投票s)
本系列文章将介绍如何使用 Microsoft 桌面技术栈(WPF、Entity Framework 4 和 SQL Server Compact Edition 4)创建现代桌面应用程序。本系列将涵盖创建围绕 MVVM 模式设计的 WPF 应用程序、将 WPF 与 Entity Framework 4 集成、使用 Entity Framework 4。
引言
在过去的几年里,Microsoft 对其桌面应用程序技术栈进行了革新,从 WinForms 转向 WPF,从 ADO.NET 转向 Entity Framework,并从 Jet 数据库引擎转向 SQL Server Compact Edition。本系列文章将解释如何使用该技术栈,并提供实施该技术栈的清单。
本系列文章共三篇
- 第 1 部分:为私有部署设置 SQL Compact 4.0
- 第 2 部分:将 Entity Framework 4.0 与 SQL Compact 4.0 结合使用
- 第 3 部分:在 MVVM 应用程序中使用 Entity Framework 4
第一部分和第二部分包含用于设置桌面应用程序的 SQL Compact 和 Entity Framework 的清单。 第三部分 展示了如何使用 MVVM 模式将 Entity Framework 4 集成到 WPF 应用程序中。演示应用程序随 第三部分 提供。本系列假设开发人员正在使用 Visual Studio 2010 (VS 2010)、Entity Framework 4.0 (EF 4) 和 SQL Server Compact Edition 4.0 (SQL Compact 4)。
使用 MS 桌面技术栈的第一步通常是创建项目并配置它以支持 SQL Compact 4.0。本系列的第一篇文章将介绍如何为 Windows 桌面应用程序设置 SQL Compact 4.0 的“私有部署”。您可以在 SQL Server Compact 开发指南中找到有关此主题的更多信息。
私有部署是指将 SQL Compact 4.0 运行时安装到您的应用程序的输出文件夹中,而不是依赖于在最终用户的计算机上进行全局安装。它消除了在最终用户的计算机上单独安装 SQL Compact 的需要,并避免了如果全局安装的 SQL Compact 被升级到更高版本时可能出现的版本冲突问题。本文提到的私有部署包括使用 Entity Framework 4.0 与 SQL Compact 4.0 所需的支持文件。
本文还解释了如何在 SQL Compact 安装中包含 SQL Compact 数据库文件。程序的步骤取决于要包含的数据库文件的角色,这可能会带来一些不寻常和具有挑战性的问题。
本文中的清单假定您正在 64 位计算机上进行开发。在这种情况下,开发计算机上的全局 SQL Compact 4.0 安装文件夹将包含 32 位和 64 位版本的 SQL Compact 4.0。清单显示了如何在目标计算机上安装这两个版本;在运行时将自动选择正确的版本。
步骤 1:配置项目
设置 SQL Compact 4.0 私有部署的第一步是在目标解决方案中创建所需的文件夹结构。
步骤 1a – 创建项目库文件夹:首先,如果尚未完成,请在 VS 2010 解决方案的根文件夹中创建一个项目库文件夹。在下面的示例中,库文件夹命名为 _Library_。
步骤 1b – 创建 SQL Compact 子文件夹:接下来,在 _Library_ 文件夹下创建一个子文件夹,用于存放 SQL Compact 4.0 程序集。在下面的示例中,此库文件夹命名为 _SqlCompact_。
步骤 1c – 创建支持程序集子文件夹:最后,在 _SqlCompact_ 文件夹下创建两个子文件夹
- AMD64
- X86
这些文件夹将用于存放 SQL Compact 4.0 的支持程序集。文件夹的名称必须与上面显示的名称一致,尽管名称不区分大小写。
步骤 2:复制程序集
在 32 位计算机上,SQL Compact 4.0 程序集安装在 _Program Files_ 文件夹中。在 64 位计算机上,程序集安装在该文件夹中,以及 _Program Files (x86)_ 文件夹中。这两个文件夹中的文件集是相同的,因此无论您是在 32 位还是 64 位计算机上进行开发,都可以从 _Program Files_ 文件夹获取要复制的文件。
请注意,SQL Compact 4.0 的私有部署需要与全局安装略有不同的 SQL Compact 4.0 程序集版本。程序集的私有部署版本位于以下子文件夹:_C:\Program Files\Microsoft SQL Server Compact Edition\v4.0\Private_。所有文件(主程序集和支持程序集)都必须从该子文件夹中复制。
MSDN 在 此页面 的底部文档说明了必须复制到目标解决方案的文件。
步骤 2a – 复制主程序集:将两个 SQL Compact 主程序集从 _Private_ 文件夹复制到步骤 1 中创建的解决方案 _SqlCompact_ 文件夹
- System.Data.SqlServerCe.dll (SQL Compact 4.0 主程序集)
- System.Data.SqlServerCe.Entity.dll (Entity Framework 4.0 数据提供程序)
此时 _SqlCompact_ 文件夹应如下所示
步骤 2b – 复制 64 位 C++ 运行时程序集:在开发计算机上,转到以下文件夹:_C:\Program Files\Microsoft SQL Server Compact Edition\v4.0\Private\amd64_。
将该文件夹中的以下文件夹复制到目标解决方案的 _AMD64_ 文件夹中
- Microsoft.VC90.CRT (Microsoft C++ 运行时程序集)
复制该文件夹(及其内容),而不仅仅是文件夹的内容。该文件夹包含在某些版本的 Windows 上运行 SQL Compact 时所需的 64 位 Microsoft C++ 运行时。
步骤 2c – 复制 64 位支持程序集:将以下四个文件从同一文件夹复制到目标解决方案的 _AMD64_ 文件夹
- sqlceer40EN.dll (SQL Compact 4.0 英文错误字符串和资源)
- sqlceme40.dll (SQL Compact 4.0 管理扩展)
- sqlceqp40.dll (SQL Compact 4.0 查询处理器)
- sqlcese40.dll (SQL Compact 4.0 存储引擎)
此时 _AMD64_ 项目库文件夹应如下所示
步骤 2d – 复制 32 位 C++ 运行时程序集:现在我们将复制 32 位版本的 C++ 运行时。 在开发计算机上,转到以下文件夹:_C:\Program Files\Microsoft SQL Server Compact Edition\v4.0\Private\x86_。
将该文件夹中的以下文件夹复制到目标解决方案的 _X86_ 文件夹中:_Microsoft.VC90.CRT_ (Microsoft C++ 运行时程序集)。
与之前一样,复制该文件夹(及其内容),而不仅仅是文件夹的内容。
步骤 2e – 复制 32 位支持程序集:与之前一样,将以下四个文件从同一文件夹复制到目标解决方案的 _X86_ 文件夹
- sqlceer40EN.dll (SQL Compact 4.0 英文错误字符串和资源)
- sqlceme40.dll (SQL Compact 4.0 管理扩展)
- sqlceqp40.dll (SQL Compact 4.0 查询处理器)
- sqlcese40.dll (SQL Compact 4.0 存储引擎)
此时 _X86_ 项目库文件夹应如下所示
至此,我们已将部署所需的文件放入项目库文件夹。现在,我们来配置 VS 2010 项目以使用 SQL Compact 4.0。
步骤 3:添加引用
设置 SQL Compact 4.0 私有部署过程的下一步是向项目中添加对 SQL Compact 主程序集的引用,并配置这些引用。
步骤 3a – 添加对主程序集的引用:我们需要手动将对 SQL Compact 主程序集的引用添加到 VS 2010 解决方案资源管理器中的项目 _References_ 列表。右键单击 _解决方案资源管理器_ 中的 _References_ 节点,然后从上下文菜单中选择 _添加引用_。单击 _浏览_ 选项卡,然后导航到项目库文件夹中的 _SQL Compact_ 文件夹
选择以下文件,然后单击 _确定_。
- System.Data.SqlServerCe.dll (SQL Compact 4.0 主程序集)
- System.Data.SqlServerCe.Entity.dll (Entity Framework 4.0 数据提供程序)
步骤 3b – 配置引用:选择上一步中的每个引用,并将其 _复制本地_ 属性设置为 _True_。这会告诉 VS 将程序集复制到应用程序输出目录,尽管 SQL Compact 已在您的开发计算机上全局安装。当 VS 2010 构建您的项目时,它会将程序集复制到应用程序输出目录,并将其添加到应用程序安装项目的 _检测到的依赖项_ 列表中。
步骤 4:添加生成后事件
有几种方法可以将 SQL Compact 运行时支持 DLL 添加到项目中。一种方法是显式添加它们,通过在项目中创建文件夹并在这些文件夹中创建指向库文件的链接。另一种方法是使用生成后事件将文件复制到应用程序输出文件夹。我更喜欢第二种方法,因为它减少了项目树的混乱。
步骤 4a – 添加生成后事件:当解决方案构建时,VS 2010 需要在应用程序输出文件夹中创建 _AMD64_ 和 _X86_ 文件夹,然后将支持 DLL 复制到这些文件夹。
主 SQL Compact 4.0 程序集会自动复制到应用程序输出文件夹,因为主项目引用了这些程序集,并且 _复制本地_ 属性已设置为 _True_。我们使用 _生成后命令_ 来复制其他文件。
生成后命令是在目标项目属性页的 _生成事件_ 页面中输入的批处理命令
创建所需文件夹并将支持 DLL 复制到这些文件夹的批处理命令如下
xcopy /s /y "$(SolutionDir)Library\SqlCompact\*.*" "$(ProjectDir)$(OutDir)"
_/s_ 开关指定应复制子文件夹及其内容,而不仅仅是目录根目录下的文件。_/y_ 开关指定应覆盖现有文件副本而不进行提示。如果省略此开关,则命令将失败 — xcopy 将尝试提示覆盖,这会使命令崩溃。
步骤 4b – 测试生成后事件:输入命令后执行测试生成。验证项目是否成功生成。如果命令失败,可能是路径存在错误。VS 2010 的错误消息将显示这两个文件夹的解析路径。如果将错误消息从 VS 2010 复制到记事本,则更容易处理路径。在记事本中,您可以从错误消息中复制每个解析后的路径,并在 Windows 资源管理器中进行测试以查找路径中的错误。通常是遗漏的空格或其他类似问题。
步骤 5:配置 App.config 文件
步骤 5a – 向 App.config 添加标记:我们需要向 _App.config_ 文件添加一些解决方法标记,以使 SQL Compact 能够使用 Entity Framework 4。首先,将以下标记添加到 _App.config_ 的 _
<system.data>
<DbProviderFactories>
<remove invariant="System.Data.SqlServerCe.4.0"/>
<add name="Microsoft SQL Server Compact Data Provider 4.0"
invariant="System.Data.SqlServerCe.4.0"
description=".NET Framework Data Provider for Microsoft SQL Server Compact"
type="System.Data.SqlServerCe.SqlCeProviderFactory, System.Data.SqlServerCe,
Version=4.0.0.1, Culture=neutral, PublicKeyToken=89845dcd8080cc91"/>
</DbProviderFactories>
</system.data>
此标记由 Erik Jensen 的博客文章进行了解释。请注意,版本引用指向 Version 4.0.0.1。这是 SQL Compact 运行时的私有部署版本。使用此特殊程序集版本提供程序将防止程序集探测从全局程序集缓存中获取提供程序的较新版本。
步骤 6:配置安装程序
此步骤通常在项目初始配置后一段时间执行,当您需要准备项目发布版本时。
步骤 6a – 从设置先决条件中删除 SQL Compact:在 VS 2010 中选择应用程序安装项目根节点,然后从上下文菜单中选择 _属性_。在项目 _属性页_ 对话框中,单击 _先决条件_ 按钮。如果 _SQL Server Compact 4.0_ 被指定为应用程序的先决条件,则 Windows Installer 将在其目标计算机上全局安装它。我们将从私有安装运行 _SQL Compact_,这意味着我们不希望 _SQL Server Compact 4.0_ 被全局安装。因此,如果该项已选中,请取消选中它。
步骤 6b – 为安装项目中的支持文件创建文件夹:在安装项目中,打开文件系统编辑器,并在应用程序文件夹节点下创建两个文件夹
- AMD64
- X86
在每个文件夹下,创建以下文件夹
- Microsoft.VC90.CRT
步骤 6c – 添加 64 位支持 DLL:在文件系统编辑器中,右键单击步骤 6b 中创建的 _AMD64_ 文件夹,然后从上下文菜单中选择 **添加 > 文件**。导航到项目库文件夹中的 _AMD64_ 子文件夹,选择该文件夹中的所有四个支持 DLL,然后单击 **打开**。
步骤 6d – 添加 64 位 C++ 运行时:在文件系统编辑器中,右键单击步骤 6b 中创建的 _AMD64\Microsoft.VC90.CRT_ 文件夹,然后从上下文菜单中选择 **添加 > 文件**。导航到项目库文件夹中的同一子文件夹,并选择该文件夹中的所有三个文件,然后单击 **打开**。
步骤 6e – 添加 32 位支持 DLL:在文件系统编辑器中,右键单击步骤 6b 中创建的 _X86_ 文件夹,然后从上下文菜单中选择 **添加 > 文件**。导航到项目库文件夹中的 _X86_ 子文件夹,选择该文件夹中的所有四个支持 DLL,然后单击 **打开**。
步骤 6f – 添加 32 位 C++ 运行时:在文件系统编辑器中,右键单击步骤 6b 中创建的 _X86\Microsoft.VC90.CRT_ 文件夹,然后从上下文菜单中选择 **添加 > 文件**。导航到项目库文件夹中的同一子文件夹,并选择该文件夹中的所有三个文件,然后单击 **打开**。
完成文件系统编辑器配置后,它应如下面的屏幕截图所示
- 已选中 _AMD64_ 文件夹
- 已选中 _AMD64\ Microsoft.VC90.CRT_ 文件夹
- 已选中 _X86_ 文件夹
- 已选中 _X86\Microsoft.VC90.CRT_ 文件夹
文件系统编辑器中的文件夹结构应镜像应用程序输出文件夹中的结构。请注意,当您将项目的应用程序输出添加到应用程序文件夹时,VS 2010 会自动检测 _System.Data.SqlServerCe.dll_ 和 _System.Data.SqlServerCe.Entity.dll_,并将这些组件添加到文件系统编辑器中应用程序文件夹的根级别。
步骤 7:向部署项目添加数据库文件模板
下一步是将数据库文件添加到安装程序。以下两种情况需要此步骤
- 模板文件:应用程序使用多个数据库文件并允许用户创建新文件。数据库文件通过“打开文件”对话框选择,新文件通过“新建文件”对话框创建。应用程序使用 xcopy 从模板(基本上是一个空的 SDF,已为应用程序配置)创建新文件。应用程序需要将模板文件与应用程序一起安装,以便在请求新文件时进行 xcopy 操作。
- 单一数据库文件:应用程序使用单个数据库文件,类似于 SQL Server 或 SQL Express 应用程序。应用程序需要将数据库文件与应用程序一起安装以进行读写操作。
由于 Windows 不允许我们访问 _c:\Program Files_ 进行数据存储或 xcopy 操作,因此无法将这两种类型的文件存储在目标计算机的应用程序文件夹中。
步骤 7a – 添加 ProgramData 文件夹:文件模板可以存储在 Windows 的名为“公共应用程序数据文件夹”的特殊文件夹中,该文件夹(在 Windows Vista 及更高版本中)映射到 _c:\ProgramData_。应用程序只需要对模板文件的只读访问权限即可执行文件的 xcopy 操作,因此 CommonAppDataFolder 在此目的下运行良好。
要添加文件模板,请转到部署项目中的文件系统编辑器
在左侧窗格(参见 1)中,右键单击“目标计算机上的文件系统”,然后从出现的上下文菜单中选择“添加特殊文件夹 > 自定义文件夹”。在属性窗格(参见 2)中,将 DefaultLocation 属性设置为 [CommonAppDataFolder]。
步骤 7b – 将模板文件添加到 ProgramData 文件夹:然后,以与上面添加 SQL Compact 支持 DLL 相同的方式,将文件模板添加到此文件夹。
步骤 8:向部署项目添加单一数据库文件
默认情况下,Windows 7 用户对 _c:\ProgramData_ 具有只读访问权限。依我看,这使得该文件夹不适合存储需要读写访问权限的单一数据库文件。可以提高应用程序在该文件夹上的权限,但我会尽一切可能避免这样做。
对于读写数据库,最合理的安装目标是 Windows“公共文档”文件夹。在 Windows Vista 及更高版本中,公共文档文件夹是 _c:\Users\Public\Documents_。.NET 提供了一个环境变量 Environment.SpecialFolder.CommonDocuments
,它映射到此文件夹,因此可以轻松地从 C# 代码访问。
不幸的是,Windows Installer 不支持公共文档文件夹 — 既不支持作为特殊文件夹,也不支持我们上面处理 ProgramData 文件夹的方式。我们可以通过让安装程序在安装计算机的注册表中查找公共文档文件夹的路径,将该路径分配给安装程序变量,然后将该变量传递给自定义文件夹来解决此限制。
步骤 8a – 查找公共文档文件夹的位置:第一步是查找安装计算机上 Windows 注册表中公共文档文件夹的路径。我们将使用安装程序搜索功能来执行此任务。在 Visual Studio 部署项目中打开“启动条件编辑器”
在左侧窗格(参见 1)中
- 右键单击“搜索目标计算机”,然后从上下文菜单中选择“添加注册表搜索”。
- 将出现一个新项目。将其命名为 Get Common Documents Folder。
在属性窗格(参见 2)中
- 将“属性”(我们的变量名称)设置为 _COMDOCFOLDER_;
- 将“根”(要搜索的注册表根键)设置为 _vsdrrHKLM_;以及
- 将“RegKey”(要查找的注册表项)设置为 _SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders_。请注意,我们在“RegKey”属性中省略了根键。
- 最后,将“值”(要在注册表项中查找的值的名称)设置为 _Common Documents_。
COMDOCFOLDER 变量现在将包含公共文档文件夹的路径。
步骤 8b – 创建一个指向公共文档文件夹的自定义文件夹:下一步是创建一个指向 COMDOCFOLDER 变量中包含的路径的自定义文件夹。转到 Visual Studio 部署项目中的文件系统编辑器
在左侧窗格(参见 1)中
- 右键单击“目标计算机上的文件系统”,然后从上下文菜单中选择“添加特殊文件夹 > 自定义文件夹”。
- 将出现一个新项目。将该项重命名为 Common Documents。
在属性窗格(参见 2)中
- 将“属性”设置为 _COMDOCFOLDER_。
- 将“DefaultLocation”属性设置为一个备用值,以在 COMDOCFOLDER 属性返回 null 值时使用 — 这永远不应该发生。我使用了 Windows Vista 及更高版本中找到的公共文档文件夹的硬编码路径。这样,安装程序在这些计算机上仍然可以正常工作。
安装程序现在拥有一个 Common Documents 文件夹,该文件夹指向 Windows 注册表中指定的 Windows 公共文档文件夹。数据库应用程序可以使用 .NET Environment.SpecialFolder.CommonDocuments
变量在 Windows 公共文档文件夹中找到数据库文件。
步骤 8b – 将单一数据库文件添加到 ProgramData 文件夹:然后,以与上面添加 SQL Compact 支持 DLL 相同的方式,将文件模板添加到此文件夹。
步骤 9:测试部署项目
通过编译部署项目并在未全局安装 SQL Compact 4.0 的计算机上运行它来测试部署项目。验证 SQL Compact 4.0 运行时文件是否已复制到目标计算机上应用程序文件夹中的正确文件夹。
结论
本系列的第二部分将介绍如何在本文创建的 SQL Compact 4 安装中使用 Entity Framework 4。本系列的第三部分将提供一个演示应用程序,该应用程序将生成的 EF 4/SQL Compact 4 框架集成到围绕 MVVM 模式设计的 WPF 应用程序中。一如既往,我欢迎您对改进本系列的评论和建议。我认为 CodeProject 读者的同行评审非常宝贵,并且始终受到赞赏。