1

急需帮助。

我首先使用实体​​框架代码,并尝试遵循 Julie Lerman 关于从域类中分离上下文的建议,但我无法让实体框架识别编译后的视图。我已经尝试了很多东西,但到目前为止最好的是我可以调用编译视图的构造函数,但第一次查询仍然需要大约 15 分钟(大约 329 个实体和 600 多个视图创建)。这让我认为它仍然必须在第一个查询中创建视图。

脚步

  1. 使用现有数据库和“模型项目”,我运行 Entity Power Tools Beta 3 以“逆向工程师代码优先”数据库。这创建了上下文、域类和映射(流利的)类。仅供参考,我这样做是因为我稍微修改了 T4 模板以匹配我们的编码标准。

  2. 使用 Julie Lerman 从她的 Plural Site 培训视频中的建议,我将域类、上下文和映射类分解为 3 个独立的项目(上下文、域类、映射)。我将模型项目中的文件分别复制到这3个项目中,然后将命名空间更改为与项目名称和位置相对应。4 个项目的结果和命名空间:“MyCompany.DataContext”、“MyCompany.DomainClasses”、“MyCompany.DomainMappings”、“MyCompany.Model”。

  3. 使用“模型项目”和从 Entity Power Tools 生成的代码,我选择了创建的上下文文件并按下鼠标右键以显示上下文菜单,从而可以选择“生成视图”。当我这样做时,它会给我一个错误“序列不包含匹配元素”。(问题 #1)

  4. 好的,所以这不起作用,所以我将“Pawel Kadluczka”的 T4 模板添加到“MyCompany.DataContext”项目以生成视图并运行该自定义工具并成功,创建视图时没有错误。但是,当我运行测试应用程序进行基本查询时,第一个查询需要 15 分钟,并且生成的视图的构造函数“ViewsForBaseEntitySets1B04A...0F8A()”不会被调用。

  5. 好的,所以这也不起作用,所以我将 T4 模板创建的“视图”文件添加到“MyCompany.DomainClasses”项目中,这样它将与类一起编译并再次运行测试应用程序。这一次,第一个查询仍然需要 15 分钟,但在启动构造函数“ViewsForBaseEntitySets1B04A...0F8A()”后大约 20 秒内被调用。这是进步,但没有香蕉。这使我认为视图必须与域类而不是上下文位于同一程序集中。 问题:这是一个正确的假设吗? 此外,由于它仍然需要 15 分钟,就像 Entity Framework 看到了视图但不喜欢它们,所以它再次重新创建它们。 可能的?

怎么办?我不知所措,一直在用头撞墙。如何创建具有多个上下文的预编译视图?观点去哪儿了?是否有我不遵循的命名空间规则?当我有 2 个或更多上下文时会发生什么?

请帮忙。公元前

4

1 回答 1

1

解决。似乎无论上下文的程序集如何,预编译的视图都必须与域类在同一个程序集中。

此外,我的问题的最终原因是我有另一个实际正在使用的上下文,而不是正在实例化的上下文。我没有意识到这两个上下文都被实例化了,但是第二个是实际调用的,并且由于我没有为其创建编译视图,因此每次运行测试应用程序都需要很长时间。现在初始查询是 18 秒而不是 15 分钟,因为我将第二个上下文与新编译的视图一起使用。

现在,我有 2 个上下文项目(MyCompany.Context、MyCompany.SystemContext)和一个 MyCompany.DomainClasses 项目、MyCompany.Model 项目和一个 MyCompany.DomainMappings 项目。我使用 T4 脚本在两个上下文项目中生成视图,并使用复制的链接包含来自 MyCompany.DomainClasses 的视图文件,这样当它重新生成时,它也会更新域类文件。这允许实体框架检测已编译的视图,从而减少第一次查询的启动时间。

于 2013-05-23T01:42:23.637 回答