MySQL实体框架 - 生成模型时超时

时间:2009-11-11 23:09:56

标签: mysql entity-framework edmgen

我在MySQL中构建了一个数据库,我正在尝试使用Entity Framework将其映射出来,但每当我尝试向EF上下文添加超过20个表时,我就会开始运行“GenerateSSDLException”。

  

类型的例外   'Microsoft.Data.Entity.Design.VisualStudio.ModelWizard.Engine.ModelBuilderEngine + GenerateSSDLException'   尝试更新时发生   来自数据库。例外   消息是:'发生错误   执行命令定义。看到   细节的内在例外。'

     

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

     

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

受影响的表并没有什么特别之处,并且它永远不会是同一个表,只是在添加了某个(非特定)数量的表之后,如果没有“Timeout expired”,则无法再更新上下文错误。有时它只留下一张桌子,有时它只有三张;结果非常不可预测。此外,在错误之前可以添加的表数的变化向我表明,问题可能在于生成的查询的大小以更新包括现有表定义的上下文,以及新表。正在加入它。从本质上讲,SQL查询变得太大,并且由于某种原因而无法执行。

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

这个问题的根源很可能在于Visual Studio中的工具,因为EdmGen2工作正常,但我希望其他人可以就如何处理这个非常独特的问题提供一些建议,因为它看起来像{ {3}}

一位同事提出的一个建议是维护两个单独的EBMX文件和一些表格交叉,但在我看来,这似乎是一个非常难看的修复。我想这是我尝试使用“新技术”的原因。 :(

7 个答案:

答案 0 :(得分:12)

我整个下午都对这个问题感到头疼。但是,我找到了一个解决方案,您只需在app.config或web.config中添加一个语句,其中您的EF desinger连接存在为'Default Command Timeout = 300000;'。问题已经消失。

答案 1 :(得分: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以外的其他属性。如果它为null,则应该使用每个MSDN的“基础提供者”中的值。如果不为null,则它是超时前的秒数的权威值。

例如:

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

答案 2 :(得分:1)

退房:

http://efvote.wufoo.com/forms/ado-net-entity-framework-vote-of-no-confidence/

哎呀,刚才意识到这个链接已经发布了!遗憾

我还强烈考虑“同事提出的一个建议是维护两个单独的EBMX文件和一些表格交叉”

它可能很丑,但它应该有效!

答案 3 :(得分:1)

你们很难解释如何轻松解决问题:

  1. 删除所有数据连接
  2. 下载最新的MySql Connector(6.3.x)
  3. 打开Visual Studio> Sever Explorer>右键单击“数据连接”>添加连接
  4. 选择MySQL数据库提供程序
  5. 输入连接详情
  6. 点击“高级”
  7. 查找连接超时并使其达到30,000
  8. 查找默认命令超时并使其类似于30,000
  9. 保存所有内容,然后再次尝试更新您的EF模型。我用EF 4.0和Vs2010进行了测试,所以我知道它有效。

答案 4 :(得分:1)

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

答案 5 :(得分:0)

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

答案 6 :(得分:0)

有两种可能性让人想起:

首先,它是EF版本1(随.NET 3.5 SP 1一起提供)。请参阅thisthis

另一种情况是,这与使用SQL Server和前ODBC驱动程序(大约1991年)的问题大致相同,其中使用了错误类型的调用:一种用于返回结果的查询({{1} }),另一个用于语句 - 不返回结果(select)。最终,连接变得无可救药地不同步,试图将SELECT结果与相应的查询进行匹配。 (在那些日子里,蓝屏死机不存在:计算机倾向于自愿重启。)

我想知道该工具是否会在正在执行的各种操作中混淆连接模式:创建表,验证创建的结构,添加新列,填充行以及在填充后验证或验证行内容。如果这是原因,那么可以通过对操作序列“更纯粹”来避免:除了完整的表之外什么都不做 - 一个接一个地创建 - 也就是说,什么都不会导致它创建一个表然后{{1}添加新列。