Entity Framework с MySQL - Истек тайм-аут при генерации модели

StackOverflow https://stackoverflow.com/questions/1718739

  •  19-09-2019
  •  | 
  •  

Вопрос

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

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

Неустранимая ошибка, возникшая во время выполнения команды.

Тайм-аут истек.Период ожидания, прошедший до завершения операции, или сервер не отвечает.

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

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

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

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

Это было полезно?

Решение

У меня просто весь день болела голова из-за этой проблемы.Однако я нашел решение, согласно которому вы можете просто добавить инструкцию в app.config или web.config, где ваше соединение EF desinger существует как "Тайм-аут команды по умолчанию = 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.Если оно равно null, предполагается, что оно использует значение в "базовом поставщике" для каждого MSDN.Если не null, то это авторитетное значение для количества секунд до истечения тайм-аута.

Например:

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

Проверьте:

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

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

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

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

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

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

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top