【问题标题】:Entity Framework Power Tools Beta 3 throws exception "sequence contains no matching element" when trying to generate viewsEntity Framework Power Tools Beta 3 在尝试生成视图时抛出异常“序列不包含匹配元素”
【发布时间】:2017-01-06 00:38:52
【问题描述】:

正在努力为数据库创建 Entity Framework 预编译视图并需要帮助。

在使用 Visual Studio 2010 时,我无法使用最新版本的 Entity Framework Power Tools Beta 3 生成预​​编译视图。当我右键单击基于 dbContext 的文件并选择“生成视图”选项时,它会弹出“序列不包含匹配元素”对话框错误框。

卸载电动工具扩展,重新启动 Visual Studio 和计算机没有帮助。

问题 1:可能导致此错误的原因。 Entity Framework Power Tools 在我让它工作之前一文不值?

所以到目前为止,我能够为此序列生成视图的唯一方法是使用 T4 模板(来自 Internet),但它经常超时并且无法完成。该数据库有大约 350 个表,它创建的视图数量约为 670 个视图。但是,它在大多数情况下都无法创建视图,我必须反复尝试,有时还要关闭并重新启动才能使其正常工作。这段时间的 CPU 使用率在 i7 Quad core 和 SSD 和 8GB 内存上大约是 12%,所以这很奇怪。但是,当视图生成时(没有超时),它们可以正常工作。

问题 2:有什么办法可以防止此模板超时和失败?

现在不能放弃我已经考虑尝试其他方法,我能够通过创建数据库优先项目并添加从现有数据库创建的实体框架数据模型来生成视图。模型创建得很好,我能够按预期创建视图,但是当放置在最终程序集中并且实体尝试查询数据库时它们无法识别。放置在程序集中时,我将使用 T4 模板生成的视图文件替换为由 Power Tools 上下文菜单创建的文件。

命名空间是否会导致此问题?

我认为它与命名空间有关,但我不知道它如何找出已编译视图的规则,以及命名空间和视图必须调用什么才能被发现和使用。从 DbContext 文件创建的视图与使用同一数据库的 Edmx 模型创建的视图位于不同的项目中。我有一个 DbContext 项目、一个模型项目、一个域类项目和域类映射项目。我将视图文件放在与域类相同的程序集(项目)中。

这是生成的视图输出的示例。左侧是使用 T4 模板和“运行自定义工具”创建的,右侧是使用 Entity Framework Power Tools Beta 3 创建的,并在 EDMX 文件上光标时从上下文菜单中选择“创建视图”。

工作一:

SELECT VALUE [xxx.yyy.Provider.DataContext.RouteStop](T1.RouteStop_RouteStopId, ...
FROM (
     SELECT   T1.RouteStopId as RouteStop_RouteStopId, .....
     FROM     CodeFirstDatabase.RouteStop AS T
     ) AS T1

不工作的一个:

SELECT Value [xxx.yyy.Provider.DataModel.Store.RouteStop](T1.RouteStop_RouteStopId, ...
FROM (
     SELECT   T1.RouteStopId as RouteStop_RouteStopId, .....
     FROM     ZeeZorProviderEdmx.RouteStops AS T
     ) AS T1

项目的命名空间包含域类,还包含生成的视图的副本,如果有帮助的话,它是“xxx.yyy.Provider.DomainClasses”。

问题 3:如何让 Power Tools 从 EDMX 生成的视图像从 T4 模板创建的其他视图文件一样工作。

我一直在听这件事,反正我也没有多少东西了,所以我真的可以使用一些好的建议。我需要一个解决方案,我看到了以下三种方法之一:

  1. 使用 Entity Framework Power Tools Beta 3 和“创建视图” 选择基于 DbContext 的对象文件时的上下文菜单选项。

  2. 使用 T4 模板,只需微笑并忍受超时问题和 构建视图时不断失败。

  3. 使用带有 EDMX 文件的模型项目并使用 Power Tools Beta 3 “创建视图”上下文菜单并解决命名空间或视图 发现问题。

请帮我找出这三种方法中的一种并让它发挥作用。

谢谢, 布莱克

【问题讨论】:

  • 在处理另一个项目时遇到类似问题后得到了另一个可能的解决方案。使用 ODP.NET 托管驱动程序连接到 Oracle 时,我的项目中没有对包含上下文和“创建预编译视图”的 Oracle DLL (Oracle.ManagedDataAccess.dll) 的引用一直说“序列不包含任何元素”。我添加了参考,问题就消失了,可以编译视图。看来,您不仅必须确保连接字符串正确,而且还必须在 app.config 中引用正确的“providerName”。

标签: entity-framework


【解决方案1】:

好的 - 我在尝试从电动工具菜单查看查看实体模型时遇到了这个问题。序列不包含任何元素。看起来工具 Beta 3 仍在建设中。原因显然是电动工具找不到连接字符串。无论如何,这是一个可行的临时解决方案。

向您的解决方案添加一个新的类库项目。如果需要,您可以删除默认的 class1。现在,添加一个带有连接字符串元素的 App.config 文件。 (我只是从真实的 App.config 中复制了我的。然后,将此项目设置为 Startup 项目。现在,当您单击 View Entity Model as readonly 菜单项时,它将显示。

我猜这些家伙正在研究这个问题。 Julie Lerman 在上面提到的链接中写了一篇博客。

希望这能解决您的一些问题。

【讨论】:

    【解决方案2】:

    你检查过你的连接字符串吗?

    这篇文章应该有助于解释您的问题: http://thedatafarm.com/blog/data-access/entity-framework-power-tool-tips-to-view-model-a-feature-i-depend-on

    【讨论】:

    • 是的,连接字符串很好,尽管根据您发送的链接检查这是件好事。
    • 我仍在调查您的回复以及上述 Greg 的回复。与此同时,我能够一遍又一遍地运行 T4 脚本,直到它最终成功运行(选项 2)。我还做了一些其他的阅读,从我听到的让选项 2 长期工作的内容来看,这可能会导致我分解 T4 脚本并以某种方式将这些步骤链接在一起。一旦我能以一种或另一种方式证明这一点,我会尽快更新连接字符串问题。
    • 项目文件夹中的项目中的连接字符串吗?我的意思是您已经在解决方案中添加了一个文件夹来组织项目。
    • 我想将 Karl 的回复标记为答案,因为他提到了一件非常重要的小事。关键是在标记为“启动”项目的项目中找到了连接字符串。如果你和我一样,你有很多,有时你会改变启动项目。
    【解决方案3】:

    有同样的问题,但不同的原因。 上下文:EF 与 Oracle 数据库一起使用

    其中一列被映射到 CLOB 列类型,EF Power Tolls 不喜欢这种类型,尽管在使用数据库时 EF 能够使用它没有问题。

    Property(l => l.MyField).HasColumnName("MY_FIELD").HasColumnType("CLOB");
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多