我在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文件和一些表格交叉,但在我看来,这似乎是一个非常难看的修复。我想这是我尝试使用“新技术”的原因。 :(
答案 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)
你们很难解释如何轻松解决问题:
保存所有内容,然后再次尝试更新您的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一起提供)。请参阅this和this。
另一种情况是,这与使用SQL Server和前ODBC驱动程序(大约1991年)的问题大致相同,其中使用了错误类型的调用:一种用于返回结果的查询({{1} }),另一个用于语句 - 不返回结果(select
)。最终,连接变得无可救药地不同步,试图将SELECT结果与相应的查询进行匹配。 (在那些日子里,蓝屏死机不存在:计算机倾向于自愿重启。)
我想知道该工具是否会在正在执行的各种操作中混淆连接模式:创建表,验证创建的结构,添加新列,填充行以及在填充后验证或验证行内容。如果这是原因,那么可以通过对操作序列“更纯粹”来避免:除了完整的表之外什么都不做 - 一个接一个地创建 - 也就是说,什么都不会导致它创建一个表然后{{1}添加新列。