EF4.1 多个嵌套实体 Includes 获取 NotSupportedException?

2024-05-01

编辑:根据测试更新了问题描述 - 2011 年 9 月 12 日。

每当我调用 .ToList() 时,我的查询都会抛出 NotSupportedException(“不支持指定的方法。”)。

IQueryable<FileDefinition> query = db
    .FileDefinitions
    .Include(x => x.DefinitionChangeLogs)
    .Include(x => x.FieldDefinitions.Select(y => y.DefinitionChangeLogs)) // bad
    .Include(x => x.FieldDefinitions.Select(y => y.FieldValidationTables)) // bad
    .Where(x => x.IsActive);
List<FileDefinition> retval = query.ToList();

如果我注释掉我注释为“坏”的任何一行,那么查询就可以工作。我还尝试在我的对象模型中包含具有相同效果的不同嵌套实体。包含任何 2 个都会导致崩溃。我所说的嵌套是指导航属性的导航属性。我还尝试使用带有字符串路径的 .include 方法:结果相同。

我的表结构如下所示:

这是使用 MySQL 5.1(显然是 InnoDB 表)作为 MySQL Connector/NET 6.3.4 的数据库存储。

所以我的问题是:为什么这不起作用?

注意:如果我显式加载相关实体,我可以让它工作,例如这个链接 http://blogs.msdn.com/b/adonet/archive/2011/01/31/using-dbcontext-in-ef-feature-ctp5-part-6-loading-related-entities.aspx。但我想知道为什么 EF 讨厌我的数据模型。

答案:MySQL 连接器显然无法处理第二个嵌套实体包含。它抛出 NotSupportedException,而不是 .NET EF。当我使用 EF4.0 尝试此操作时,也出现了同样的错误,但当时的研究使我相信是自我跟踪实体导致了该问题。我尝试升级到最新的连接器,但它开始导致不同步错误 http://bugs.mysql.com/bug.php?id=61806。这是还有一个原因 http://kasey-jo.blogspot.com/2010/03/mysql-shortcomings.html让我讨厌MySQL。


也许有点晚了,但我发现以下解决方法在当前项目中相当有用:

IQueryable<FileDefinition> query = db.FileDefinitions
    .Include(x => x.FieldDefinitions.Select(y => y.DefinitionChangeLogs.Select(z => z.FieldDefinition.FieldValidationTables)))

不使用第二行包含,而是使用“选择”返回到原始导航属性,并使用另一个“选择”前进到需要包含的属性。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

EF4.1 多个嵌套实体 Includes 获取 NotSupportedException? 的相关文章

随机推荐