LINQ 和部署 SQL Server CE 3.5






4.75/5 (17投票s)
如何部署使用 LINQ 进行数据访问的应用程序的 SQL Server CE 3.5。
引言
LINQ 是 .NET Framework 3.5 中一个非常有用的新语言特性。它允许通过实际的编程语言(因此 LINQ 中的“Language INtegrated”)查询各种数据结构。此外,特定的变体 LINQ to SQL,包含一个完整的 O/RM(对象关系映射器)。由于许多开发人员花费大量时间将关系数据映射到对象,因此这个内置工具可以节省大量时间。当然,这并非一个新概念,也不是 .NET 中的第一个此类工具。它只是免费且内置的!LINQ to SQL 目前仅支持 SQL Server 2005。鉴于 Entity Framework 和 LINQ to Entities 即将推出,微软不太可能再为其他提供程序提供支持。但是,有一种方法可以让标准的 LINQ to SQL 与 SQL Server Compact Edition (SSCE) 一起使用。您必须使用 SqlMetal 命令行工具来生成相应的文件。一旦生成了 .dbml 文件,您甚至可以在 Visual Studio 2008 设计器中打开它。
使用 LINQ 时部署 SSCE
将 SSCE 与您的桌面应用程序一起部署非常简单。您可以通过 ClickOnce 快速发布您的应用程序,但我不太喜欢这项技术。我更喜欢安装程序。您可以使用任何您喜欢的安装程序,并且仍然可以通过几种选项轻松部署 SSCE。
Windows Installer
首先,您可以选择为系统安装所需版本(3.5 或更高版本以支持 LINQ)的 SSCE 创建一个先决条件或依赖性检查。如果未安装该引擎,您可以将用户引导至 Microsoft 网站进行安装,或者您可以启动其可再分发 Windows Installer 文件。此方法要求用户具有 Administrator 权限才能执行系统安装。
请注意,如果您启动 .msi 文件来安装 SSCE,并且您的安装程序是 Windows Installer 程序,您将必须先关闭您的安装程序;两个 Windows Installer 实例不能同时运行。
X-Copy
其次,您可以直接将 SSCE 引擎所需的必要可再分发库文件复制到应用程序的安装目录中。此方法 **不需要** Administrator 权限!需要将七个文件与您的应用程序一起复制,并且它们应该被复制到与您的主可执行文件相同的目录中。
- sqlceca35.dll
- sqlcecompact35.dll
- sqlceer35EN.dll
- sqlceme35.dll
- sqlceoledb35.dll
- sqlceqp35.dll
- sqlcese35.dll
确保您的应用程序引用了 System.Data.SqlServerCe.dll 程序集,并且也设置为将程序集本地复制。当您在 SSCE 中使用 LINQ to SQL 时,这一点尤其重要,因为该程序集在运行时会被隐式引用,因此在部署到没有安装 SSCE 的系统之前,您的应用程序中并不需要显式引用它。
请注意,如果您选择以任何形式(Windows Installer 或单独的库)重新分发 SSCE,您必须 向 Microsoft 注册重新分发权限。
隐藏的问题
这其中存在一个隐藏的问题,最终会在 x-copy 方法中显现出来。由于 LINQ 使用 工厂模式 来获取所需的数据提供程序,因此对提供程序的必要引用直到运行时才会发生。问题就在于此。
当您的应用程序通过 LINQ 第一次尝试连接到 SSCE 数据库文件(而没有系统安装)时,您将收到以下错误消息
Cannot open "X:Pathtodatafiledatafile.sdf".
Provider 'System.Data.SqlServerCe.3.5' not installed.
如果用户通过 Windows Installer 文件安装了 SSCE,这个问题就得到了解决。安装程序会在您的 machine.config 文件中添加一个条目。由于 x-copy 安装的全部目的通常是避免需要 Administrator 权限,因此这根本行不通。
相反,如果您还没有应用程序配置文件,您将需要为您的桌面应用程序添加一个。在“解决方案资源管理器”中右键单击您的项目,选择“添加新...”>“应用程序配置文件”,然后单击“确定”。确保新文件如下所示:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.data>
<DbProviderFactories>
<remove invariant="System.Data.SqlServerCe.3.5" />
<add
name="Microsoft SQL Server Compact Data Provider"
invariant="System.Data.SqlServerCe.3.5"
description=".NET Framework Data Provider for Microsoft SQL Server Compact"
type="System.Data.SqlServerCe.SqlCeProviderFactory,
System.Data.SqlServerCe,
Version=3.5.0.0,
Culture=neutral,
PublicKeyToken=89845dcd8080cc91"
/>
</DbProviderFactories>
</system.data>
</configuration>
这样可以确保为您的应用程序添加适当的数据库提供程序工厂,而无需编辑最终用户的 machine.config 文件或要求系统安装 SSCE。