2009-11-11 40 views
9

我已经在MySQL中构建了一个数据库,并且试图将它与实体框架进行映射,但是当我尝试添加更多内容时,我开始运行到“GenerateSSDLException”在EF上下文中有20个表。使用MySQL的实体框架 - 超时生成模型

类型的异常 'Microsoft.Data.Entity.Design.VisualStudio.ModelWizard.Engine.ModelBuilderEngine + GenerateSSDLException' 试图更新从数据库 发生。 异常消息是:'执行命令定义时发生错误 。详细内容见内部例外 '。

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

超时已过期。操作完成之前超时的时间或服务器没有响应。

受影响的表没有什么特别之处,它从不是相同的表,它只是在添加了某些(非特定)数量的表之后,如果没有“超时过期“错误。有时只剩下一张桌子,有时候只剩下三张桌子;结果相当不可预测。此外,在错误发生之前可以添加的表的数量的差异向我表明,可能问题在于为了更新包括现有表定义的上下文而生成的查询的大小,以及新的表正在被添加到它。实质上,SQL查询变得太大,并且由于某种原因无法执行。

如果我生成模型EdmGen2它没有任何错误,但生成的EDMX文件不能在Visual Studio中更新,而不会产生上述异常。

很可能这个问题的根源在于Visual Studio中的工具,因为EdmGen2可以正常工作,但是我希望其他人可以提供一些关于如何处理这个非常特殊问题的建议,因为它看起来像I'm not the only person experiencing it

一位同事提出的一个建议是维护两个独立的EBMX文件和一些表格交叉,但在我看来这看起来像一个相当丑陋的修复。我想这是我尝试使用“新技术”所得到的结果。 :(

+0

我不愿意upvote任何这些答案,因为他们都没有真正的目标的实际问题......蜥蜴的答案是唯一一个类似的答案,但仍然不是那里... – 2009-11-23 21:34:19

+0

对不起,我不能更多的帮助,但这就是我会做的:p。如果你感到慷慨的话,会喜欢upvote!大声笑 – Lizard 2009-11-24 16:11:19

+0

弥敦道:看到我的答案在下面。接受的答案对于这个问题是不正确的。 – 2012-03-08 03:07:02

回答

12

我刚在这个问题上头痛了整个下午。但是,我发现解决方案只需在app.config或web.config中添加一条语句,其中您的EF设备连接存在为'Default Command Timeout = 300000;'。问题没有了。

+0

这工作完美。哎呀,你是上帝。 – 2009-12-07 16:48:04

+1

什么是新的连接字符串?我正在尝试,但我在输出中出现此错误不支持'默认命令超时'关键字。 – effkay 2009-12-13 11:07:43

+0

n.m.固定....和代表Wh ...拯救了我的生命:) – effkay 2009-12-15 11:56:15

0

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

0

两种可能性映入脑海:

首先是,它是EF版本1(它随.NET 3.5 SP 1)查看thisthis

另一种情况是,这种感觉与SQL Server和ODBC驱动程序(大约1991年)在使用错误类型的调用时遇到的症状大致相同:一种用于查询返回结果(select),而其他语句 - 不返回结果(create table)。最终,连接变得绝望地不同步,试图将SELECT结果匹配到相应的查询。(在那些日子里,蓝屏死机中并不存在:电脑往往不是自愿重新启动。)

不知该工具在各种操作执行混乱的连接模式:创建表,验证创建的结构,添加新列,填充行,并在填充后验证或验证行内容。如果这是原因,那么可以通过关于操作序列的“更纯粹”来避免它:除了完整的表格之外,什么也不做,这将导致它创建表格,然后alter table添加新的列。

+0

不知道我怎么能用Visual Studio中的EF工具来做到这一点。正如我上面所解释的,如果我尝试在一个操作中添加所有表格,它将在100%的时间内失败。 – 2009-11-23 19:27:26

1

你们都弱不解释如何解决容易的问题:

  1. 删除所有数据连接
  2. 下载最新的MySQL连接器(6.3.x的)
  3. 打开Visual Studio> Sever的浏览器>右键点击“数据连接”>添加连接
  4. 选择MySQL数据库提供商
  5. 输入连接的详细信息
  6. 点击“高级”
  7. 查找连接超时,使它的东西大概30,000
  8. 查找默认的命令超时并使其大概30,000

保存所有东西,然后尝试再次更新您的EF模型。我测试了EF 4.0和Vs2010,所以我知道它的工作原理。

+0

哈哈! @Omar,如果你想提供更好的答案,也许你可以建议为什么会发生这种情况? – 2010-03-29 22:48:27

+0

@Omar:你知道它的工作原理是因为你在EF和VS的不同版本上测试过吗? – Lucas 2010-04-20 22:22:52

5

以上建议不正确。

Default Command Timeout是您需要更改的唯一连接字符串参数。 Connect Time只是调整等待获得连接的时间量;那不是你的问题。

Default Command Timeout似乎对Connector/Net 6.3.4的连接字符串没有影响。我认为这是Connector/Net中的一个错误,我向Oracle提交了一个bug report编辑:这个错误被MySql开发人员确认,并且自2010年10月13日起已被修复。修复被放在6.0.8,6.1.6,6.2.5和6.3.5。

我身边,这是我的ObjectContext对象的CommandTimeout属性更改为null以外的东西的唯一途径。如果它为空,则应该使用每个MSDN的“基础提供程序”中的值。如果不为空,则它是超时之前秒数的权威值。

例如:

var context = new CitationData.de_rawEntities(); 
context.CommandTimeout = 180; 
+0

在所有场景中指定CommandTimeout都适用于我;但是,我使用的是.NET Connector的较旧版本,因此我不能说最新版本。设置context.CommandTimeout与上述问题无关,因为问题不在代码中,而是在实体框架可视编辑器/设计器中选择“从数据库更新模型”时发生。 – 2010-09-15 22:53:51

+0

是的,我只推荐context.CommandTimeout,因为Connector/Net 6.3.4中连接字符串中的默认命令超时似乎被破坏了。也许它仍然适用于你正在使用的版本?顺便说一句,CommandTimeout(没有空格或“默认”)似乎是ObjectContext的属性,而默认命令超时似乎是连接字符串属性。 – 2010-09-18 20:59:24

+0

连接字符串中的非工作默认命令超时实际上是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已经修复。 – 2010-11-22 19:54:45

1

我尝试了所有的上述溶液的无济于事。我下载了MySQL的最新.NET连接器(6.3.6),问题消失了。