5

我正在使用带有 MySQL 的实体框架。以下查询导致错误:

var foobar = ctx.ArticleBase.OfType<ActicleSpecial>().Include("CreatedBy.Image.Location").ToList();

错误:“MySQL 不支持 OUTER APPLY”我在一些不同的查询中也得到“MySQL 不支持 CROSS APPLY”。

我有以下数据模型: 替代文字

除了 Image 实体具有名为 Location 关系的 Location 实体(一对多关系)之外,UserBase 具有 Image 关系而不是 UserSpecial。

为什么我会收到此错误?如何避免这个错误?是否可以?

4

2 回答 2

3

如果此错误来自 MySQL,则发生以下两种情况之一:

  1. 您没有正确配置提供程序。
  2. 您的 EF 提供程序中存在错误。

如果此错误来自您的 MySQL EF 提供程序,则发生以下两种情况之一:

  1. 您没有正确配置提供程序。
  2. 您的 EF 提供程序存在限制。

SQL 由提供程序生成。您可以通过EDMX中的 ProviderManifestToken 属性配置特定于服务器版本的 SQL 生成。这就是您告诉提供者不要使用旧服务器版本不支持的 SQL 功能的方式。

某些 MySQL 存储引擎可能支持其他不支持的 SQL 功能。在这种情况下,提供者需要使用大多数引擎支持的通用功能子集,或者使用ProviderManifestToken以允许您选择。

但是,有缺陷的提供程序也可能只是返回不正确的 SQL。如果是这种情况,那么您必须找到更新或避免涉及错误的查询。

更新:根据@Devart 的回答,这似乎是提供者的限制,这是由于 MySQL 的限制而设计的。EF 将生成 ADO.NET 规范命令树。将其转换为 SQL 是提供者的责任。如果 EF 在 CCT 中返回一个交叉/外部应用节点,似乎 Devart 还没有找到将其转换为 MySQL 可以处理的 SQL 的方法。因此,要么 MySQL 无法胜任支持所有 EF 查询的任务,要么 MySQL 专家(不是我!)需要向 Devart 展示如何生成与 MySQL 兼容的 SQL,该 SQL 可以正确返回交叉/外部应用的行CCT 节点。

于 2010-02-25T13:56:40.713 回答
3

这是一个实体框架内部架构特性。有时它会生成 SQL Server 以外的提供程序不支持的查询。MSDN上提供了更多信息。

于 2010-02-25T14:29:05.437 回答