9

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

尝试从数据库更新时出现“Microsoft.Data.Entity.Design.VisualStudio.ModelWizard.Engine.ModelBuilderEngine+GenerateSSDLException”类型的异常。异常消息是:'执行命令定义时发生错误。有关详细信息,请参阅内部异常。

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

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

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

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

鉴于 EdmGen2 工作正常,这个问题的根源很可能在于 Visual Studio 中的工具,但我希望也许其他人可以就如何解决这个非常独特的问题提供一些建议,因为看起来我不是唯一经历它的人

一位同事提出的一个建议是维护两个单独的 EBMX 文件,并带有一些表交叉,但在我看来,这似乎是一个非常丑陋的解决方案。我想这就是我尝试使用“新技术”的结果。:(

4

7 回答 7

12

我整个下午都在为这个问题头疼。但是,我找到了解决方案,您可以在 app.config 或 web.config 中添加一条语句,其中您的 EF desinger 连接存在为“默认命令超时 = 300000;”。问题没有了。

于 2009-12-07T10:48:40.103 回答
5

上面的建议是不正确的。

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

Default Command Timeout似乎对连接器/网络 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 以外的其他值。如果它为空,则应该使用每个 MSDN 的“基础提供程序”中的值。如果不为 null,则它是超时前秒数的权威值。

例如:

var context = new CitationData.de_rawEntities();
context.CommandTimeout = 180;
于 2010-09-15T19:44:15.640 回答
1

查看:

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

哎呀,刚刚意识到这个链接已经发布了!对不起

我也会强烈考虑“一位同事提出的一个建议是维护两个单独的 EBMX 文件,并带有一些表交叉”

它可能很难看,但它应该可以工作!

于 2009-11-23T21:19:48.213 回答
1

你们很弱,没有解释如何轻松解决问题:

  1. 删除所有数据连接
  2. 下载最新的 MySql 连接器 (6.3.x)
  3. 打开 Visual Studio >服务器资源管理器>右键单击“数据连接”>添加连接
  4. 选择 MySQL 数据库提供商
  5. 输入连接详细信息
  6. 点击“高级”
  7. 找到连接超时并将其设置为 30,000
  8. 找到默认命令超时并将其设置为 30,000

保存所有内容,然后再次尝试更新您的 EF 模型。我用 EF 4.0 和 Vs2010 对此进行了测试,所以我知道它可以工作。

于 2010-03-17T22:29:15.503 回答
1

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

于 2011-01-07T19:36:53.753 回答
0

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

于 2009-11-17T15:31:34.363 回答
0

脑海中浮现出两种可能性:

首先是它是 EF 版本 1(随 .NET 3.5 SP 1 提供)。看到这个这个

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

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

于 2009-11-22T08:47:10.793 回答