更新向导无响应

42
每次我需要从数据库更新我的emdx时,更新向导花费的时间太长了,一旦点击完成(以完成更新)按钮就会变成无响应状态。
我使用Visual Studio 2015和LocalDb SQL Server 2014。有些人建议安装Service Pack 1 来解决此问题。我已经安装了 LocalDb 的 SP1,但没有帮助。我的VS2015也是相对较新的版本。
我有最新的Entity Framework 6版本(来自nuget)。

同样的问题出现在使用Visual Studio 2015和真实的SQL Server 2014时。 - juwens
@jens 你解决了这个问题吗? - Santhos
6
我们认为这是由于 SQL Server 2014 中基数估算器的退化所致。我们之前在 EF Tools 中引入了一个解决方法,即向所有模式查询追加 OPTION (QUERYTRACEON 9481)(有关详细信息,请参见http://entityframework.codeplex.com/workitem/2445),但不幸的是,这导致了功能回归,例如,如果用户没有足够的数据库权限,模式查询将无法成功,因此我们不得不取消这个解决方法。看起来这个退化问题已经被修复,但最近我们又收到了新的报告。我们正在跟进 SQL Server。 - divega
1
@divega 有关修复的任何更新吗? - sparkyShorts
1
以下是与EF和SQL 2016相同问题的问题跟踪器:https://github.com/aspnet/EntityFramework6/issues/4。一些人报告说`update statistics`命令会有所帮助... - Rory
7个回答

83

将数据库的兼容性级别设置为110对我很有用。

要检查兼容性级别,请运行此脚本:

select compatibility_level from sys.databases where name = '<YOUR_DB_NAME>'

使用以下脚本设置兼容级别:

alter database <YOUR_DB_NAME> set compatibility_level = 110

1
我认为我的原始值是120,但自从我进行操作以来已经有一段时间了。我也相信,根据您所使用的本地SQL版本,原始值可能会有所不同。 - Santhos
1
对我来说运行得非常好。有人能解释一下为什么我们要将兼容级别设置为110吗?这会有什么副作用吗? - Waheed
1
我得到了这个信息:数据库兼容级别的有效值为80、90或100。我应该选择什么? - Icet
1
@Waheed,请查看divega评论中的问题注释。 - Santhos
1
这个方法适用于我使用的Visual Studio 2015 Update 3和SQL Server 2014(12.0.2000)。 - Andrew
显示剩余5条评论

21

在数据库上运行以下内容适用于我:

ALTER DATABASE SCOPED CONFIGURATION SET LEGACY_CARDINALITY_ESTIMATION=ON

然后,在更新之后,可以使用以下方式将其设置回来:

ALTER DATABASE SCOPED CONFIGURATION SET LEGACY_CARDINALITY_ESTIMATION=OFF

根据 Github 上 EF6 仓库中的 这个讨论串,我们可以得知以下内容。

需要注意的是,那个讨论串中也有提到下面的方法可行,不过因为前者已经对我很有效了,所以我没有进行测试:

UPDATE STATISTICS sys.syscolpars
UPDATE STATISTICS sys.sysschobjs
UPDATE STATISTICS sys.syssingleobjrefs
UPDATE STATISTICS sys.sysiscols

他们还把这个问题抛给了SQL Server团队,并在Microsoft Connect上开放了这个问题


1
这对我有用。请注意:被接受的答案设置了数据库兼容性级别。我相信将其设置为110会启用旧版基数估算。在尝试被接受的答案之前,我们需要更多人测试此答案。 - Derreck Dean
2
我认为ALTER DATABASE只适用于SQL Server 2016。版本2014不识别该命令。它可以识别那些UPDATE,但它们没有帮助,向导也遇到了同样的问题。对我有用的是更改兼容性级别。 - Andrew
1
这应该是被接受的答案。将此添加到我的发布后脚本中,如果“$(DatabaseName)”=“dev-App”,则修改数据库作用域配置集以启用传统的基数估计 = ON。 - Rob
1
修改数据库对我也有用,我使用的是SQL Server 2017,不确定为什么在2018年这仍然存在。 - afr0
1
是的,我在@mssql2016上设置了LEGACY_CARDINALITY_ESTIMATION=ON并且它起作用了。我们真的需要再次将其关闭吗?如果不关闭会发生什么?这里没有解释 https://learn.microsoft.com/en-us/sql/t-sql/statements/alter-database-scoped-configuration-transact-sql - oneNiceFriend
显示剩余2条评论

3

今天,我和同事们让向导程序独自更新了约10分钟。虽然花费了相当长的时间,但最终完成了更新。这对我们来说是目前最好的解决方案,因为我们没有适当的权限来设置数据库的兼容性级别。


2
是的,它能完成任务,但需要非常长的时间。 - Santhos
@Santhos 是的,这很烦人。我前几天花了大约30分钟更新一个大模型。非常令人沮丧。 - sparkyShorts
我的程序已经运行了一个小时,我只是尝试添加一个表格(这是初始设置)。这是典型的“停机问题”,但我现在想放弃它...唉。 - David

1

对我来说,更改SQL Server兼容性级别或跟踪标志9481不是一个选择。

我尝试了EntityFramework Reverse POCO Generator

https://visualstudiogallery.msdn.microsoft.com/ee4fcff9-0c4c-4179-afd9-7a2fb90f5838

这是一个可配置的通用T4模板,至今表现良好。
它甚至有一个提到的跟踪标志选项。

IncludeQueryTraceOn9481Flag = false; // 如果在保存此文件时出现SqlServer 2014冻结/花费很长时间,请尝试将其设置为true(您还需要提升权限)。

讽刺的是,即使关闭了标志,它也能快速运行 :) 看起来他们在元数据查询方面与VS EF Designer使用不同的查询。

1

我仍然需要使用 Microsoft SQL Server 2014 (SP2-GDR) (KB4019093) - 12.0.5207.0 (X64) Jul 3 2017 02:25:44 版权所有 (c) Microsoft Corporation 标准版 (64位) on Windows NT 6.3 <X64> (Build 9600: ) (Hypervisor) 以及Entity Framework 6.2.0。这个问题为什么还没有解决?!


0

MariaDB缓慢手册解决方案

  • 使用EF6,VisualStudio 2015与MariaDB 10.2。
  • 就像@Santhos所说的那样,为我浪费了大量时间。看起来VisualStudio在解析那个巨大的XML文件时很慢(我的开发机器只有8GB RAM)。不开玩笑,需要大约15分钟才能刷新。
  • 我学到了手动“重置”一些文件,然后通过GUI更新快速解决问题。我可以在1-2分钟内完成全新模型的创建。

手动刷新步骤

  1. 使用下面的EDMX Diagram Boilerplate替换您的.edmx.diagram文件内容
  2. 使用下面的EDMX Runtime Boilerplate替换您的.edmx文件内容
  3. 返回VisualStudio,双击您的EDMX,在空屏幕中右键单击,选择从数据库更新模型

EDMX Diagram Boilerplate

<?xml version="1.0" encoding="utf-8"?>
<edmx:Edmx Version="3.0" xmlns:edmx="http://schemas.microsoft.com/ado/2009/11/edmx">
 <!-- EF Designer content (DO NOT EDIT MANUALLY BELOW HERE) -->
  <edmx:Designer xmlns="http://schemas.microsoft.com/ado/2009/11/edmx">
    <!-- Diagram content (shape and connector positions) -->
    <edmx:Diagrams>
      <Diagram DiagramId="820459acb0f543cfaf7db8643f38c2d6" Name="Diagram1" ZoomLevel="85">
        </Diagram>
    </edmx:Diagrams>
  </edmx:Designer>
</edmx:Edmx>

EDMX 运行时样板

<?xml version="1.0" encoding="utf-8"?>
<edmx:Edmx Version="3.0" xmlns:edmx="http://schemas.microsoft.com/ado/2009/11/edmx">
  <!-- EF Runtime content -->
  <edmx:Runtime>
    <!-- SSDL content -->
    <edmx:StorageModels>
    <Schema Namespace="ShareDirectModel.Store" Provider="MySql.Data.MySqlClient" ProviderManifestToken="5.5" Alias="Self" xmlns:store="http://schemas.microsoft.com/ado/2007/12/edm/EntityStoreSchemaGenerator" xmlns:customannotation="http://schemas.microsoft.com/ado/2013/11/edm/customannotation" xmlns="http://schemas.microsoft.com/ado/2009/11/edm/ssdl">
        <EntityContainer Name="ShareDirectModelStoreContainer">
          </EntityContainer>
      </Schema></edmx:StorageModels>
    <!-- CSDL content -->
    <edmx:ConceptualModels>
      <Schema Namespace="ShareDirectModel" Alias="Self" annotation:UseStrongSpatialTypes="false" xmlns:annotation="http://schemas.microsoft.com/ado/2009/02/edm/annotation" xmlns:customannotation="http://schemas.microsoft.com/ado/2013/11/edm/customannotation" xmlns="http://schemas.microsoft.com/ado/2009/11/edm">
        <EntityContainer Name="ShareDirectContext" annotation:LazyLoadingEnabled="true">
          </EntityContainer>
        </Schema>
    </edmx:ConceptualModels>
    <!-- C-S mapping content -->
    <edmx:Mappings>
      <Mapping Space="C-S" xmlns="http://schemas.microsoft.com/ado/2009/11/mapping/cs">
        <EntityContainerMapping StorageEntityContainer="ShareDirectModelStoreContainer" CdmEntityContainer="ShareDirectContext">
          </EntityContainerMapping>
      </Mapping>
    </edmx:Mappings>
  </edmx:Runtime>
  <!-- EF Designer content (DO NOT EDIT MANUALLY BELOW HERE) -->
  <Designer xmlns="http://schemas.microsoft.com/ado/2009/11/edmx">
    <Connection>
      <DesignerInfoPropertySet>
        <DesignerProperty Name="MetadataArtifactProcessing" Value="EmbedInOutputAssembly" />
      </DesignerInfoPropertySet>
    </Connection>
    <Options>
      <DesignerInfoPropertySet>
        <DesignerProperty Name="ValidateOnBuild" Value="true" />
        <DesignerProperty Name="EnablePluralization" Value="true" />
        <DesignerProperty Name="IncludeForeignKeysInModel" Value="true" />
        <DesignerProperty Name="UseLegacyProvider" Value="false" />
        <DesignerProperty Name="CodeGenerationStrategy" Value="None" />
        <DesignerProperty Name="DDLGenerationTemplate" Value="$(VSEFTools)\DBGen\SSDLToMySQL.tt" />
      </DesignerInfoPropertySet>
    </Options>
    <!-- Diagram content (shape and connector positions) -->
    <Diagrams></Diagrams>
  </Designer>
</edmx:Edmx>

-1

这种问题通常发生是因为运行 SQL Server 的服务器本身状况不佳。可能是服务器上的磁盘空间或内存不足以完成任务。

检查运行数据库的服务器。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接