使用MySQL的Entity Framework - 生成模型时超时了

8
我已经在MySQL中构建了一个数据库,并尝试使用Entity Framework进行映射,但是当我尝试将超过20个表添加到EF上下文时,就会遇到“GenerateSSDLException”异常。

在尝试从数据库更新时发生了'Microsoft.Data.Entity.Design.VisualStudio.ModelWizard.Engine.ModelBuilderEngine+GenerateSSDLException'类型的异常。 异常消息为:“执行命令定义时发生错误。请参见内部异常以获取详细信息。”

在执行命令期间遇到致命错误。

超时已过期。 操作未完成或服务器未响应。

受影响的表没有什么特别之处,而且每次出现错误的表格都不一样,只是在添加了一定数量的表格后,上下文就无法更新,会出现“超时”错误。有时只剩下一个表格,有时则是三个,结果相当难以预测。此外,添加表格数量的变化表明,问题可能在于生成用于更新包括现有表格定义和新添加表格的上下文的查询语句大小。基本上,SQL查询语句太大,由于某种原因未能执行。

如果我使用EdmGen2生成模型,则可以无错误地工作,但是生成的EDMX文件不能在Visual Studio中更新,否则就会产生上述异常。

很可能这个问题的根源在于Visual Studio中的工具,因为EdmGen2运行良好,但我希望其他人能提供一些关于如何解决这个非常独特问题的建议,因为似乎我不是唯一遇到这个问题的人

我的同事提出的一个建议是使用两个不同的EBMX文件并进行表格交叉,但在我看来这似乎是一种相当丑陋的解决方案。我想这就是尝试使用“新技术”时所遇到的问题。:(


我不确定是否要点赞这些答案,因为它们中没有一个真正针对实际问题... Lizard的回答是唯一类似于答案的,但还不够完整... - Nathan Taylor
抱歉我不能再提供更多帮助了,但这就是我会做的:p。如果您感到慷慨的话,希望能得到您的点赞!哈哈 - Lizard
Nathan:请看下面我的回答。对于这个问题,被接受的答案是不正确的。 - Aren Cambre
@ArenCambre 我已经很久没有处理这个问题了,刚刚重新阅读了你下面的回复,我仍然坚持我最初对那个答案的评论。当时,问题在于Entity Framework工具本身,因此我无法通过更改代码来解决它。我并不是说你的解决方案对于另一个可能类似的问题是不正确的,但那是一个不同的问题。最终,这个线程上被接受的答案解决了我遇到的问题。 - Nathan Taylor
7个回答

11

在整个下午里,我都对这个问题感到头痛。然而,我找到了解决方案,只需在包含EF designer连接的app.config或web.config中添加一条语句 'Default Command Timeout=300000;'。问题就解决了。


1
新的连接字符串是什么?我正在尝试,但输出中出现了错误:“default command timeout”关键字不受支持。 - effkay
那真是太烦人了...干得好! - Christian Payne
你刚刚让我的生活变得轻松了许多。谢谢你。+1 - Michael

5
上述建议不正确。
只需要更改Default Command Timeout连接字符串参数。 Connect Time仅调节在第一次获取连接时等待的时间量,这不是您的问题。 Default Command Timeout似乎在使用Connector/Net 6.3.4的连接字符串中没有效果。我认为这是Connector/Net中的错误,并向Oracle提交了错误报告编辑:此错误已被MySql开发人员确认,并已于2010年10月13日修复。修复程序已放入6.0.8、6.1.6、6.2.5和6.3.5中。 我解决这个问题的唯一方法是将ObjectContext对象的CommandTimeout属性更改为非null值。如果它是null,则根据MSDN应该使用“底层提供程序”的值。如果不是null,则是超时前的秒数的权威值。
例如:
var context = new CitationData.de_rawEntities();
context.CommandTimeout = 180;

指定 CommandTimeout 在所有场景下都适用;但是,我正在使用较旧的 .NET 连接器版本,因此我无法就最新版本发表意见。设置 context.CommandTimeout 对上述问题不相关,因为这个问题并非在代码中出现,而是在实体框架可视化编辑器/设计师中选择“从数据库更新模型”时出现的。 - Nathan Taylor
是的,我只推荐使用context.CommandTimeout,因为连接字符串中的默认命令超时似乎在Connector/Net 6.3.4版本中失效了。也许在你使用的版本上仍然有效?顺便说一下,CommandTimeout(没有空格或“Default”)似乎是ObjectContext的属性,而默认命令超时则是连接字符串属性。 - Aren Cambre
连接字符串中无法正常工作的默认命令超时确实是 Connector/Net 中的一个错误。这影响了从6.0版本开始的所有版本。有关详细信息,请参见 http://bugs.mysql.com/bug.php?id=56806(您可能需要登录才能查看错误报告)。截至10月13日,版本6.0.8、6.1.6、6.2.5和6.3.5已经修复了此问题。 - Aren Cambre

1

1
你们很弱,没有简单地解释如何修复问题:
  1. 删除所有数据连接
  2. 下载最新的 MySql Connector (6.3.x)
  3. 打开 Visual Studio > Server Explorer> 右键 "Data Connections" > 添加连接
  4. 选择 MySQL 数据库提供程序
  5. 输入连接详细信息
  6. 点击 "高级"
  7. 找到连接超时并将其设置为大约 30,000
  8. 找到默认命令超时并将其设置为大约 30,000

保存所有更改,然后尝试再次更新你的 EF 模型。我已经在 EF 4.0 和 Vs2010 中进行过测试,所以它是可行的。


哈哈!@Omar,如果你想提供更好的答案,也许你可以建议一下为什么会发生这种情况? - Christian Payne
@Omar:你知道它能工作是因为你在不同版本的EF和VS上测试过吗? - Lucas

1

我尝试了上述所有解决方案,但都无济于事。我下载了最新的MySQL .NET连接器(6.3.6),问题就消失了。


0
尝试使用dotConnect for MySQLEntity Developer
我们在工具的模型生成过程中进行了一些改进。您可以将Devart实体模型添加到您的项目中,它类似于ADO.NET实体框架模型,但有一些改进,并且没有超时问题。

0

我想到了两种可能性:

第一种是它是EF版本1(随.NET 3.5 SP 1一起发布)。请参见thisthis

另一种可能是这感觉上与SQL Server和pre-ODBC驱动程序(大约在1991年)得到的相同症状,其中使用了错误类型的调用:一种用于返回结果的查询(select),另一种用于不返回结果的语句(create table)。最终,连接变得无法同步,试图将SELECT结果与相应的查询匹配起来。(在那些日子里,“蓝屏死亡”不存在:计算机倾向于自愿重新启动。)

我想知道这个工具是否在执行各种操作时混淆了连接模式:创建表、验证已创建的结构、添加新列、填充行以及在填充后验证或验证行内容。如果是这个原因,那么可以通过更加“纯粹”地执行操作序列来避免:仅完成一个接一个的表创建,即不要执行任何会导致它创建表然后alter table添加新列的操作。


我不确定如何在Visual Studio的EF工具中完成这个操作。正如我上面所解释的,如果我尝试一次性添加所有表格,它会100%失败。 - Nathan Taylor

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