2

我使用 EF 5 和代码优先开发了一个非常好的网络应用程序。但是在运行基准测试时,我发现性能没有我想要的那么好......进一步看,我发现 EF 生成的所有查询都相似Select * From,这不是最佳实践。

在此处阅读此答案Select Specific Columns from Database using EF Code First我明白我可以生成一个视图并将其映射到一个实体。我的问题是如何首先使用 EF 5 代码将视图映射到实体,反之亦然?

我问这个的原因是:我有一张非常宽的桌子,我在上面按名称执行“初步搜索”搜索项目,然后在一个案例中返回其余部分......在另一个案例中,我有一个大桌子和大多数时候我只使用标题和描述而不是 LOB 列......在所有情况下,我从数据库中获取一些我没有使用的东西......

因此,如果我确实可以将视图映射到实体,反之亦然,我可以在主干层和应用层之间节省大量带宽......

4

2 回答 2

1

这与您所说的不同——即不是一个确切的答案——而是通过 EF 所谓的“视图”来解决性能问题。

我建议您试用EF Power Tools - 和“生成视图”。

通过运行它 - 'views' 文件被添加到项目中 - 这是.cs一个 - 并且增强了核心 EF 性能(这是一个 EF 功能,不是代码优先 - 但我们现在可以使用电动工具代码优先)。

它没有添加“数据库视图”——但据我所知——它通过预先分析和代码生成 SQL 模板来工作。

“在实体框架可以针对概念模型执行查询或保存对数据源的更改之前,它必须生成一组本地查询视图来访问数据库。这些视图是每个应用程序域缓存的元数据的一部分。如果您在同一个应用程序域中创建多个对象上下文实例,它们将重用缓存元数据中的视图,而不是重新生成它们。因为视图生成是执行单个查询的总成本的重要部分,实体框架使您能够预先生成这些视图并将它们包含在编译的项目中。有关更多信息,请参阅性能注意事项(实体框架)。
http://msdn.microsoft.com/en-us/library/bb896240.aspx

我可以“感觉到”性能的提升。

注意:
它有几个问题- 你可能会在第一次运行它时遇到一些异常:

  • 确保你的类是文件中唯一的上下文(它需要第一个),
  • 我不得不将项目从“解决方案目录”中移出(这是我从 power-shell 控制台学到的技巧 - 需要相同)

此外,任何其他使用“真实”视图手动“调整”Db 的尝试 - 我认为都是徒劳的,因为它没有与 ORM 紧密集成(您需要不止一个 - 以及匹配的调用等)。

于 2013-04-03T15:10:29.607 回答
0

我实现这一目标的方式不是很干净,但是:

  • 我创建了一个类型
  • 为该类型声明一个 dbset
  • 如有必要,将表删除到数据库中
  • 创建一个视图,命名为具有相同字段(类型和名称)的已删除表。

当然,所有这些都封装在种子方法中。

不干净,但正在运行。我认为如果您想“迁移”视图的结构,就会遇到一些麻烦。但这样一来,他的一切就好像你得到了一个实体一样。当然插入和更新可能很棘手,但这不是我的目的。

如果您尊重命名约定,即使加载策略也是可用的。

于 2013-04-02T21:29:28.653 回答