【问题标题】:Linq to EntitiesLinq 到实体
【发布时间】:2009-06-08 14:50:16
【问题描述】:

我构建了一个包含继承的实体框架 (v1) 模型,如下所示:

基类:问题

投诉

客户查询 等(6 个派生类)

这些类映射到 SQL Server 中的相应表。

然后我可以使用 LINQ to 实体进行创建的方式给我留下了深刻的印象 - EF 发现它必须将一些数据放在一个表中,获取标识键值并在另一个表中使用它。

但是:当我进行如下简单查询时

var result = dataContext.IssueSet.Where(x => x.Id == id);

... ToTraceString 揭示了超过 1000 行的 SQL 代码!而且它的表现很棒。

你认为我的模型可能做错了什么,还是 L2E 中继承结构的巨大 SQL 代码特征?

附:这是信息的 SQL 跟踪字符串的开头

SELECT 
1 AS [C1], 
CASE WHEN (( NOT (([UnionAll8].[C45] = 1) AND ([UnionAll8].[C45] IS NOT NULL))) 
AND ( NOT (([UnionAll8].[C46] = 1) AND ([UnionAll8].[C46] IS NOT NULL))) 
AND ( NOT (([UnionAll8].[C47] = 1) AND ([UnionAll8].[C47] IS NOT NULL))) 
AND ( NOT (([UnionAll8].[C48] = 1) AND ([UnionAll8].[C48] IS NOT NULL))) 
AND ( NOT (([UnionAll8].[C49] = 1) AND ([UnionAll8].[C49] IS NOT NULL))) 
AND ( NOT (([UnionAll8].[C50] = 1) AND ([UnionAll8].[C50] IS NOT NULL))) 
AND ( NOT (([UnionAll8].[C51] = 1) AND ([UnionAll8].[C51] IS NOT NULL))) 
AND ( NOT 

【问题讨论】:

标签: linq-to-entities


【解决方案1】:

我认为查询一点也不简单。考虑您要求框架实际执行的操作:物化一个实体,该实体可能是至少六种不同类型之一。事实上,您可能知道您要实现的实体类型。 您只是没有将这些信息提供给框架。

所以,一些想法:

  • 从包含多种类型的实体集中选择单一类型的实体时,使用 OfType 通知框架您不打算具体化任何其他类型
  • 考虑使用每个层次结构的表而不是每个类型的表模型,尤其是当大多数子类型有许多共同的字段时。
  • 在良好 OOD 的约束下,不要过度使用继承。我发现许多人倾向于使用继承来解决可以通过组合更好地解决的问题,无论是否使用实体框架。
  • 在注销 Entity Framework 时要小心,因为您在第一次尝试使用它时遇到了问题,因为您在留言板上阅读了一些内容,这让您停下来。这个框架很复杂,它的工作方式与许多人的预期不同,但当你理解它时它确实运作良好。您第一次尝试使用它可能不正确。坚持下去,了解框架的工作原理。

【讨论】:

  • 使用 OfType 会生成一个类似的查询(1000 多行)。 TPH 严重缺乏吸引力——违反了我所重视的数据实践。我们使用关系数据库/规范化是有原因的——ORM 不应该迫使我们远离良好的实践。即使是一个简单的继承案例似乎也会导致相同的 SQL 生成模式,所以我看不出它目前如何在任何实际场景中可用。我非常努力地坚持使用 L2E,但在继承查询的情况下不得不依赖存储的过程(带有 EF 扩展),这是我真正希望避免的事情。
  • 小心告诉自己“实体框架就是这样工作的”。这是逃避解决问题的借口。我们确实在我们的实体模型中使用了继承(尽管从它的声音来看,必须比你这样做;我发现值对象比具有行为的类型更不需要),每个层次结构的表和每个类型的表,我们不在查询中看到 1000 多行 SQL。所以在你的场景中有些东西是不对的。我建议从一个更简单的模型开始,然后将其构建为您想要的模型,一次看看问题出在哪里。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-26
  • 1970-01-01
相关资源
最近更新 更多