我们有一个使用MySQL的数据库第一个实体框架模型,我们遇到的问题包括一个查询中的所有子对象。我们的数据库结构简化如下:
MDType ====== ID ... MDTypeParameter =============== ID -- PK MetaDataTypeID -- references MDType.ID ... Object ========== ID -- PK ... ObjectItem ========== ID -- PK ObjectID -- references Object.ID MDTypeID -- references MDType.ID ObjectItemParameter =================== ID -- PK ObjectItemID -- references ObjectItem.ID MDTypeParameterID -- references MDTypeParameter.ID
我们基本上有元数据(MDType),其中包含0到多个参数(MDTypeParameter),其中包括格式,名称等内容。
我们的实时数据(Object)有0到多个项目(ObjectItem),它们与MDType相关联。一个项目有0到多个参数(ObjectItemParameter),用于记录用户输入的详细信息等。
数据可能如下所示:
MDType ====== 1,'Book' 2,'DVD' MDTypeParameter =============== 1,1,'Pages' 2,1,'ISBN' 3,2,'Total Runtime' 4,2,'Studio' Object ====== 1,'Lord of the Rings' ObjectItem ========== 1,1,1 2,1,2 ObjectItemParameter =================== 1,1,1,'100 pages' 1,1,2,'SOME ISBN N0.' 1,2,3,'300 minutes' 1,2,4,'Newline Cinema'
使用Entity Framework执行以下Include()函数集时,生成的SQL不正确,LINQ查询为:
entities.Object.Include("ObjectItem.ObjectItemParameter").
Include("ObjectItem.MDType.MDTypeParameter");
但它产生的SQL看起来像:
SELECT `Project4`.`ID`, -- ALL OTHER FIELDS FROM (SELECT `Apply1`.`ID`, -- OTHER FIELDS `UnionAll1`.`ID` AS `C2`, `UnionAll1`.`ID1` AS `C3`, `UnionAll1`.`ID2` AS `C4`, -- WHAT THE HELL IS `UnionAll1` ??? FROM (SELECT `Limit1`.`ID`, -- OTHER FIELDS FROM (SELECT `Project1`.`ID`, -- OTHER FIELDS FROM (SELECT `Extent1`.`ID`, -- OTHER FIELDS FROM `Object` AS `Extent1` ) AS `Project1` LIMIT 5) AS `Limit1` ) AS `Apply1` ) AS `Project4`
当我读到这篇文章时,似乎实体框架变得非常困惑。有一个名为UnionAll1
的别名表,它永远不会被定义,它永远不会在必需的表上生成任何连接。
有没有人看到类似的东西或知道如何诊断问题?
用于获取上述查询的LINQ查询是:
entities.Object.Include("ObjectItem.ObjectItemParameter").
Include("ObjectItem.MDType.MDTypeParameter").Take(5)