实体框架 (SQL Server Compact)

实体框架是 ADO.NET 中的一组技术,支持面向数据的软件应用程序的开发。通过实体框架,开发人员可以处理域特定的对象和属性形式的数据(如客户和客户地址),而无须考虑存储此数据的基础数据库表和列。

通过使开发人员可以处理更高抽象级别的数据,实体框架支持独立于任何特定数据存储引擎或关系架构的代码。通过根据概念性应用程序模型进行编程而不是直接根据关系存储架构进行编程,开发人员可以创建数据访问应用程序。

实体框架应用程序和服务由概念模型、存储模型和这两者之间的映射组成。为满足希望从现有数据库派生实体数据模型 (EDM) 的开发人员的需要,实体框架提供了一组基于概念模型生成和验证 EDM 并创建可编程类的工具。

通过 EDM,ADO.NET 可以在 .NET 环境中将实体作为对象公开。这样,对象层就成为语言集成查询 (LINQ) 支持的理想目标。LINQ to Entities 允许开发人员通过直接从开发环境使用 LINQ 表达式和 LINQ 标准查询运算符,根据实体框架对象上下文创建灵活的强类型查询。有关实体框架和 LINQ to Entities 的详细信息,请参阅 Entity Framework(实体框架)文档。

SQL Server Compact 自 SQL Server Compact 4.0 开始提供对 Web 应用程序平台的实体框架的支持。

SQL Server Compact 中的实体框架

若要将实体框架与 SQL Server Compact 4.0 一起使用,请首先安装实体框架。实体框架是 .NET Framework 4 的组件。

对 SQL Server Compact 4.0 的开发支持由 Visual Studio 2010 Service Pack 1 提供。对 Visual Studio 2010 Service Pack 1 中实体框架的实体数据模型设计器支持由实体框架工具提供。请注意,从 Visual Studio 2008 Service Pack 1 (SP1) 开始,实体数据模型设计器(实体设计器)是 Visual Studio 的一个组件。它是用于创建和编辑实体数据模型 (EDM) 的可视工具。有关此工具的详细信息,请参阅 Entity Framework(实体框架)文档。

在 SQL Server Compact 4.0 版本中,SQL Server Compact 提供一个托管程序集:System.Data.SQLServerCe.Entity.dll。System.Data.SQLServerCe.Entity.dll 程序集由 ADO.NET 托管数据提供程序 System.Data.SqlServerCE.dll 在内部使用,它支持访问在实体数据模型 (EDM) 中描述的数据。

安装 SQL Server Compact 4.0 或更高版本的 SQL Server Compact (SSCERuntime-ENU.msi) 时,System.Data.SQLServerCe.Entity.dll 安装在文件夹 %ProgramFiles%\Microsoft SQL Server Compact Edition\v4.0 下。

备注

您只能将 SQL Server Compact 4.0 用于 .NET Framework 版本 4 中的实体框架 4。SQL Server Compact 4.0 不支持 .NET Framework 3.5,并且将引发错误。

代码优先/仅代码

SQL Server Compact 4.0 支持 ADO.NET 实体框架 4 的代码优先编程模型。有两种创建实体框架 Web 应用程序的方式:数据库优先模型优先。模型优先是 ADO.NET 实体框架 4 (.NET Framework 4) 中的新功能,它对于称为代码优先/仅代码开发的开发支持更“以代码为中心的”开发工作流。在此工作流中,CODE 是您的模型。代码优先编程模型的工作方式类似于:

  • 为了使用“仅代码”,应创建一些 POCO (Plain Old CLR Object) classes(POCO(纯旧的 CLR 对象)类)。它们主要由构造函数组成。

  • 下一步是编写从 ObjectContext 派生的类以便描述您的模型的形状和访问您的 POCO 类的方式。它是可识别实体框架的类。

在此阶段中,您有了 CLR 的一切,但是由于没有实体框架元数据无法使用 ObjectContext 类,该元数据存储在 EDMX 文件中。在“仅代码”中,没有 EDMX 文件。

  • 为了使用该元数据,您需要定义 ContextBuilder,在此定义您的 SqlConnection。ContextBuilder 扫描 ObjectContext 的属性并按约定推断默认概念模型、存储模型和映射。然后,它使用该元数据和您通过 ContextBuilder 传输的 SqlConnection 来创建 EntityConnection。

  • 此后,通过将 EntityConnection 传递给在 POCO 类中创建的构造函数,创建 ObjectContext 的实例。

  • 创建您的上下文实例后,您可以使用很多扩展方法来:

    1. 自动创建数据库脚本,

    2. 检查数据库是否存在,

    3. 创建数据库,

    4. 删除数据库等。

如果不使用约定,您还可以覆盖它们。在实体框架 4 中,将 ContextBuilder 重构为 ModelBuilder 和 DbModel。

要下载,请访问 ADO.NET Entity Framework 4(ADO.NET 实体框架 4)。

SQL Server Compact 的限制

与实体框架一起使用时,SQL Server Compact 有以下一些限制:

  • SQL Server Compact 4.0 与实体框架一起使用时,仅在键的类型为标识列的情况下支持具有服务器生成的键或值的实体。

    使用实体框架时,实体的键可能被标记为服务器生成的。这样,数据库就可以在插入时或创建实体时生成键值。此外,可以将实体的零个或多个属性标记为服务器生成的值。有关详细信息,请参阅实体框架文档中的 Store Generated Pattern(存储生成的模式)主题。

    实体框架允许您定义具有服务器生成的键或值的实体类型。对具有服务器生成的值(类型不是标识)的实体进行的数据处理操作会引发“不支持”异常。

  • 如果在 SQL Server Compact 架构中存在重复的约束名称,则生成用于 SQL Server Compact 4.0 的实体数据模型将失败。

    在 SQL Server Compact 中,约束名称在表中是唯一的,这可以允许在数据库中存在重复的约束名称。此行为与 SQL Server 不同,在 SQL Server 中,约束名称在整个数据库中是唯一的。如果某一 SQL Server Compact 4.0 架构具有重复的引用完整性(主键 – 外键关系)约束名称,则使用 ADO.NET 实体框架的实体数据模型向导生成实体数据模型将失败。应通过向约束名称添加表名等操作,始终使约束名称在数据库中保持唯一。

  • 虽然实体 SQL 支持完全外部联接,但是 SQL Server Compact 不支持使用实体框架的完全外部联接。例如,不支持以下查询:

    实体 SQL:

    SELECT c.Name, c.Id, o.Id 
    FROM NW.Customers AS c 
    FULL OUTER JOIN NW.Orders AS o ON c.Id = o.CustomerId
    

    请注意,SQL Server Compact 支持使用实体框架的内部联接、左外部联接和右外部联接。

  • SQL Server Compact 不支持实体 SQL 查询的ORDER BY 子句中的 COLLATE 子子句。

    实体 SQL 允许将 COLLATE 子子句指定为 ORDER BY 子句中每个键的一部分。COLLATE 子子句仅适用于字符串值表达式,它确定用于该表达式的比较语义。

    与实体框架一起使用时,SQL Server Compact 不支持在实体 SQL 查询的 ORDER BY 子句中使用 COLLATE 子子句。例如,不支持以下查询:

    实体 SQL:

    SELECT value c 
    FROM NW.Customers AS c 
    ORDER BY c.Name COLLATE Traditional_Spanish_ci_ai 
    
  • 与 SQL Server 不同,SQL Server Compact 不支持对 real、float、money 和 numeric 数据类型执行取模操作(由 % 表示)。

    在 SQL Server Compact 中,以下查询会导致错误消息:

    实体 SQL:

    ( CAST ( 1 AS Edm.Int16) % CAST ( 1 AS Edm.Decimal) ) 
    

    Transact-SQL:

    SELECT cast (1 as smallint) %cast (1 as decimal(28,4)) 
    

    在运行此类查询时,将显示以下错误消息:“实数、浮点、货币和数字数据类型不支持‘模’。[ Data type = numeric ]”

  • SQL Server Compact 不支持聚合(max、min、sum、count)中的 DISTINCT。

    如果尝试编写在聚合(max、min、sum、count)中使用 DISTINCT 的实体 SQL 和 Transact-SQL 查询,将引发“不支持”异常。下面的示例演示在聚合 count 中使用 DISTINCT 的实体 SQL 查询。

    实体 SQL:

    SELECT count(distinct [TaskId]) FROM ArubaContainer.TaskSet AS [Task]
    
  • 与实体框架一起使用时,SQL Server Compact 不支持命令超时。

    通过使用 ObjectContext.QueryTimeout 属性或 EntityCommand.CommandTimeout 属性,实体框架允许指定命令的超时。

    与实体框架一起使用时,SQL Server Compact 不支持超时。换句话说,不得将命令超时设置为非零值。如果设置了连接超时属性,则 SQL Server Compact 数据库将引发 NotSupportedException(“CommandTimeout”) 异常。

  • SQL Server Compact 仅支持 Unicode 字符串。

    实体框架提供了对 Unicode 字符串和非 Unicode 字符串的支持。SQL Server Compact 仅支持 Unicode 字符串。当前提供程序不支持类型为“String”的文本 <literal>。在非 Unicode 字符串中 SQL Server Compact 将引发“接近常量”异常。

  • SQL Server Compact 不支持存储过程和视图。

示例

若要了解如何创建将 SQL Server Compact 数据库用作数据源的实体框架应用程序,请参阅创建实体框架应用程序 (SQL Server Compact)

请参阅

其他资源

生成托管应用程序 (SQL Server Compact)