Kas*_*man 6 c# mysql-connector entity-framework-4 notsupportedexception
编辑:根据测试更新了问题描述 - 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();
Run Code Online (Sandbox Code Playgroud)
如果我注释掉我评论为"坏"的任一行,那么查询就可以了.我也尝试在我的对象模型中包含不同的嵌套实体,效果相同.包括任何2将导致崩溃.嵌套,我的意思是导航属性的导航属性.我也尝试将.Include方法与字符串路径一起使用:结果相同.
我的表结构如下所示:


这显然使用MySQL 5.1(显然是InnoDB表)作为MySQL Connector/NET 6.3.4的数据库存储.
所以我的问题是:为什么这不起作用?
注意:如果我明确加载此链接中的相关实体,我可以使其工作.但我想知道为什么EF讨厌我的数据模型.
答案:MySQL Connector显然无法处理第二个嵌套实体包含.它抛出NotSupportedException,而不是.NET EF.当我使用EF4.0尝试这个时,同样的错误也存在,但我当时的研究让我相信它是导致问题的自我跟踪实体.我尝试升级到最新的Connector,但它开始导致Out of Sync错误.这是我讨厌MySQL的另一个原因.
我制作了一个小控制台应用程序来测试您的场景,并且此测试应用程序有效:
using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Linq;
namespace EFIncludeTest
{
public class Parent
{
public int Id { get; set; }
public string Name { get; set; }
public ICollection<ChildLevel1> ChildLevel1s { get; set; }
}
public class ChildLevel1
{
public int Id { get; set; }
public string Name { get; set; }
public ICollection<ChildLevel2a> ChildLevel2as { get; set; }
public ICollection<ChildLevel2b> ChildLevel2bs { get; set; }
}
public class ChildLevel2a
{
public int Id { get; set; }
public string Name { get; set; }
}
public class ChildLevel2b
{
public int Id { get; set; }
public string Name { get; set; }
}
public class MyContext : DbContext
{
public DbSet<Parent> Parents { get; set; }
}
class Program
{
static void Main(string[] args)
{
// Create entities to test
using (var ctx = new MyContext())
{
var parent = new Parent
{
Name = "Parent",
ChildLevel1s = new List<ChildLevel1>
{
new ChildLevel1
{
Name = "FirstChildLevel1",
ChildLevel2as = new List<ChildLevel2a>
{
new ChildLevel2a { Name = "FirstChildLevel2a" },
new ChildLevel2a { Name = "SecondChildLevel2a" }
},
ChildLevel2bs = new List<ChildLevel2b>
{
new ChildLevel2b { Name = "FirstChildLevel2b" },
new ChildLevel2b { Name = "SecondChildLevel2b" }
}
},
new ChildLevel1
{
Name = "SecondChildLevel1",
ChildLevel2as = new List<ChildLevel2a>
{
new ChildLevel2a { Name = "ThirdChildLevel2a" },
new ChildLevel2a { Name = "ForthChildLevel2a" }
},
ChildLevel2bs = new List<ChildLevel2b>
{
new ChildLevel2b { Name = "ThirdChildLevel2b" },
new ChildLevel2b { Name = "ForthChildLevel2b" }
}
},
}
};
ctx.Parents.Add(parent);
ctx.SaveChanges();
}
// Retrieve in new context
using (var ctx = new MyContext())
{
var parents = ctx.Parents
.Include(p => p.ChildLevel1s.Select(c => c.ChildLevel2as))
.Include(p => p.ChildLevel1s.Select(c => c.ChildLevel2bs))
.Where(p => p.Name == "Parent")
.ToList();
// No exception occurs
// Check in debugger: all children are loaded
Console.ReadLine();
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
我的理解是,这基本上代表了您的模型和您正在尝试的查询(还考虑您对问题的评论)。但某个地方一定有一个重要的差异,在您问题的代码片段中不可见,并且导致您的模型无法工作。
编辑
我已经使用 MS SQL 提供程序(SQL Server 2008 R2 Express DB)而不是 MySQL Connector 测试了上面的工作控制台应用程序。显然这是“重要的区别”。
| 归档时间: |
|
| 查看次数: |
1777 次 |
| 最近记录: |