Entity Framework 的 SqlClient 中的已知问题

本部分介绍与适用于 SQL Server 的 .NET Framework 数据提供程序(SqlClient)相关的已知问题。

字符串函数中的结尾空格

SQL Server 忽略字符串值中的尾随空格。 因此,传递字符串中的尾随空格可能导致意外的结果,甚至会导致失败。

如果字符串中必须有尾随空格,应考虑在末尾追加空格字符,以便 SQL Server 不会剪裁字符串。 如果尾随空格不是必需的,应在传递给查询管道之前进行修整。

RIGHT 函数

如果将非null值作为第一个参数传递,并将0作为第二个参数传递给RIGHT(nvarchar(max))RIGHT(varchar(max)),则会返回NULL值,而不是empty字符串。

CROSS 和 OUTER APPLY 运算符

SQL Server 2005 中引入了 CROSS 和 OUTER APPLY 运算符。 在某些情况下,查询管道可能会生成包含 CROSS APPLY 和/或 OUTER APPLY 运算符的 Transact-SQL 语句。 由于某些后端提供程序(包括 SQL Server 2005 之前的 SQL Server 版本)不支持这些运算符,因此无法在这些后端提供程序上执行此类查询。

下面是可能导致输出查询中存在 CROSS APPLY 和/或 OUTER APPLY 运算符的一些典型方案:

  • 带分页的相关子查询。

  • 相关子查询或导航所生成的集合上的 AnyElement

  • 使用接受元素选择器的分组方法的 LINQ 查询。

  • 显式指定了 CROSS APPLY 或 OUTER APPLY 的查询

  • 在 REF 构造上具有 DEREF 构造的查询。

SKIP 运算符

如果使用 SQL Server 2000,则对非键列使用 SKIP 和 ORDER BY 可能会返回不正确的结果。 如果非键列中包含重复数据,则可能会跳过比指定数量更多的行。 这是因为 SQL Server 2000 中 "SKIP" 的翻译方式。 例如,在以下查询中,如果 E.NonKeyColumn 具有重复值,可能会跳过 5 个以上的行:

SELECT [E] FROM Container.EntitySet AS [E] ORDER BY [E].[NonKeyColumn] DESC SKIP 5L  

以正确的 SQL Server 版本为目标

以基于 SQL Server 版本(在存储模型 (.ssdl) 文件中 Schema 元素的 ProviderManifestToken 特性中指定)的 Transact-SQL 查询为实体框架目标。 此版本可能与连接到的实际 SQL Server 版本不同。 例如,如果使用 SQL Server 2005,但 ProviderManifestToken 属性设置为 2008,则生成的 Transact-SQL 查询可能不会在服务器上执行。 例如,使用 SQL Server 2008 中引入的新日期时间类型的查询不会在早期版本的 SQL Server 上执行。 如果使用 SQL Server 2005,但 ProviderManifestToken 属性设置为 2000,则生成的 Transact-SQL 查询可能不太优化,或者可能会收到一个异常,指出不支持该查询。 有关更多信息,请参见本主题前面的“CROSS 和 OUTER APPLY 运算符”部分。

某些数据库行为取决于设置为数据库的兼容级别。 ProviderManifestToken如果属性设置为 2005,并且 SQL Server 版本为 2005,但数据库的兼容级别设置为“80”(SQL Server 2000),则生成的 Transact-SQL 将面向 SQL Server 2005,但由于兼容级别设置,可能无法按预期执行。 例如,如果 ORDER BY 列表中的列名称与选择器中的列名匹配,则可能会丢失排序信息。

投影中的嵌套查询

投影子句中的嵌套查询可在服务器上转换为笛卡尔积查询。 在某些后端服务器上(包括 SQL Server)上,这可能会导致 TempDB 表变得非常大。 这可以减少服务器性能。

下面是投影子句中嵌套查询的示例:

SELECT c, (SELECT c, (SELECT c FROM AdventureWorksModel.Vendor AS c  ) As Inner2 FROM AdventureWorksModel.JobCandidate AS c  ) As Inner1 FROM AdventureWorksModel.EmployeeDepartmentHistory AS c  

服务器生成的 GUID 标识值

Entity Framework 支持服务器生成的 GUID 类型标识值,但提供程序必须支持在插入行后返回服务器生成的标识值。 从 SQL Server 2005 开始,可以通过 OUTPUT 子句在 SQL Server 数据库中返回服务器生成的 GUID 类型。

另请参阅