Entity Framework с MySQL - истекло время ожидания при создании модели - PullRequest
9 голосов
/ 12 ноября 2009

Я создал базу данных в MySQL и пытаюсь отобразить ее с помощью Entity Framework, но начинаю сталкиваться с «GenerateSSDLException» всякий раз, когда пытаюсь добавить более 20 таблиц в контекст EF.

Исключение типа 'Microsoft.Data.Entity.Design.VisualStudio.ModelWizard.Engine.ModelBuilderEngine + GenerateSSDLException' произошла при попытке обновления из базы данных. Исключение сообщение: «Произошла ошибка во время выполнение определения команды. Увидеть внутреннее исключение для деталей. '

Во время выполнения команды произошла фатальная ошибка.

Истекло время ожидания. Время ожидания истекло до завершения операции, или сервер не отвечает.

Нет ничего особенного в затронутых таблицах, и это никогда не одна и та же таблица (и), просто после добавления определенного (неопределенного) количества таблиц контекст больше не может быть обновлен без «Истекло время ожидания» ошибка. Иногда остается только один стол, а иногда три; результаты довольно непредсказуемы. Кроме того, разница в количестве таблиц, которые могут быть добавлены до ошибки, указывает мне, что, возможно, проблема заключается в размере генерируемого запроса для обновления контекста, который включает в себя как существующие определения таблиц, так и новые таблицы, которые добавляются к нему. По сути, запрос SQL становится слишком большим и по какой-то причине не может быть выполнен.

Если я сгенерирую модель с помощью EdmGen2 , она будет работать без ошибок, но сгенерированный файл EDMX не может быть обновлен в Visual Studio без создания вышеупомянутого исключения.

По всей вероятности, источник этой проблемы лежит в инструменте в Visual Studio, учитывая, что EdmGen2 работает нормально, но я надеюсь, что, возможно, другие могли бы дать несколько советов о том, как подойти к этой очень уникальной проблеме, потому что это выглядит как Я не единственный, кто испытывает это .

Одно предложение, предложенное коллегой, заключалось в том, чтобы поддерживать два отдельных файла EBMX с некоторым пересечением таблицы, но, на мой взгляд, это выглядит довольно уродливо. Я полагаю, что это то, что я получаю за попытку использовать «новые технологии». (

Ответы [ 7 ]

12 голосов
/ 07 декабря 2009

У меня просто была головная боль по этой проблеме весь день. Однако я нашел решение, в котором вы можете просто добавить оператор в app.config или web.config, где ваше соединение EF desinger существует, как «Default Command Timeout = 300000;». Проблема ушла.

5 голосов
/ 15 сентября 2010

Вышеприведенный совет неверен.

Default Command Timeout - единственный параметр строки подключения, который необходимо изменить. Connect Time просто регулирует количество времени ожидания для получения соединения в первую очередь; это не твоя проблема.

Default Command Timeout, по-видимому, не влияет на строку соединения с Connector / Net 6.3.4. Я думаю, что это ошибка в Connector / Net, и я подал отчет об ошибке в Oracle. РЕДАКТИРОВАТЬ: Эта ошибка была признана разработчиками MySql и была исправлена ​​по состоянию на 13.10.2010. Исправления были внесены в 6.0.8, 6.1.6, 6.2.5 и 6.3.5.

Единственный способ обойти это - изменить свойство CommandTimeout моего объекта ObjectContext на что-то отличное от нуля. Если значение равно null, предполагается, что для MSDN используется значение «базового поставщика». Если не ноль, это официальное значение количества секунд до истечения времени ожидания.

Например:

var context = new CitationData.de_rawEntities();
context.CommandTimeout = 180;
1 голос
/ 07 января 2011

Я испробовал все вышеперечисленное решение безрезультатно. Я загрузил последний .NET-коннектор для MySQL (6.3.6), и проблема исчезла.

1 голос
/ 18 марта 2010

Вы, ребята, слабы, не объясняя, как легко решить проблему:

  1. Удалить все ваши подключения данных
  2. Загрузить последнюю версию MySql Connector (6.3.x)
  3. Откройте Visual Studio> Sever Explorer> Щелкните правой кнопкой мыши «Соединения данных»> Добавить соединение
  4. Выберите поставщика базы данных MySQL
  5. Введите данные для подключения
  6. Нажмите «Аванс»
  7. Найдите время ожидания подключения и сделайте что-то вроде 30 000
  8. Найдите тайм-аут команды по умолчанию и сделайте что-то вроде 30 000

Сохраните все и попробуйте обновить модель EF снова. Я проверял это с EF 4.0 и Vs2010, поэтому я знаю, что это работает.

1 голос
/ 24 ноября 2009

Выезд:

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

Упс, только что понял, что эта ссылка уже размещена! извините

Я бы также настоятельно рекомендовал: «Одно предложение, предложенное коллегой, содержало два отдельных файла EBMX с некоторым пересечением таблицы»

Это может быть некрасиво, но должно работать!

0 голосов
/ 22 ноября 2009

На ум приходят две возможности:

Во-первых, это EF версии 1 (поставляется с .NET 3.5 SP 1). См. это и это .

Другая причина в том, что это похоже на те же симптомы, которые были у SQL Server и драйверов до ODBC (около 1991 г.), когда использовался неправильный тип вызова: один тип используется с запросами, возвращающими результаты (select) и другой для операторов - не возвращает результат (create table). В конце концов соединение стало безнадежно несинхронизированным, пытаясь сопоставить результаты SELECT с соответствующим запросом. (В те дни Blue Screen Of Death не существовало: вместо этого компьютер имел тенденцию к добровольной перезагрузке.)

Интересно, не запутывает ли инструмент режим соединения во множестве выполняемых операций: создание таблиц, проверка созданной структуры, добавление нового столбца, заполнение строк, а также проверка или проверка содержимого строки после заполнения. Если это и есть причина, то ее можно избежать, если «чище» относиться к последовательности операций: ничего не делать, но полная таблица создает одну за другой, то есть не делать ничего, что могло бы заставить ее создать таблицу, тогда alter table для добавить новые столбцы.

0 голосов
/ 17 ноября 2009

Попробуйте dotConnect для MySQL с Entity Developer .
Мы внесли некоторые улучшения в процесс создания моделей в наших инструментах. Вы можете добавить Devart Entity Model в свой проект, который похож на модель ADO.NET Entity Framework, но имеет некоторые улучшения и не имеет проблемы с тайм-аутом.

...