Entity Framework с MySQL - истекло время ожидания при создании модели

Я создал базу данных в 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 ответов

Решение

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

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

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.

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

Например:

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

Проверять, выписываться:

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

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

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

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

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

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

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

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

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

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

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

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

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

Другие вопросы по тегам