Подтвердить что ты не робот

Использование MySql с Entity Framework 4 и Code-First Development CTP

Мне показалось, что я немного экспериментирую со Скоттом Гатри последним сообщением для первого кода кода с Entity Framework 4. Вместо использования Sql Server, Я пытаюсь использовать MySql. Вот соответствующие части моего web.config(это приложение Asp.Net MVC 2):

<connectionStrings>
    <add name="NerdDinners"
         connectionString="Server=localhost; Database=NerdDinners; Uid=root; Pwd=;"
         providerName="MySql.Data.MySqlClient"/>
  </connectionStrings>
  <system.data>
    <DbProviderFactories>
      <add name="MySQL Data Provider" 
           invariant="MySql.Data.MySqlClient" 
           description=".Net Framework Data Provider for MySQL" 
           type="MySql.Data.MySqlClient.MySqlClientFactory, MySql.Data, Version=6.2.3.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d" />
    </DbProviderFactories>
  </system.data>

Как и в учебнике, я ожидаю, что EF4 автоматически сгенерирует db для меня. Вместо этого он выдает исключение ProviderIncompatibleException, с внутренним исключением, жалующимся на то, что база данных NerdDinners не существует.

Достаточно честный; Я пошел и создал MySql db для него, чтобы посмотреть, будут ли все работать, и вместо этого получилось другое ProviderIncompatibleException. На этот раз "DatabaseExists не поддерживается провайдером".

Я признаю, что это первый раз, когда я действительно вникаю в Entity Framework (я придерживался главным образом Linq to Sql), и все это работает на Code-First CTP, выпущенном только на прошлой неделе. Тем не менее, есть ли что-то, что я делаю неправильно здесь, или известная проблема, с которой можно работать?

4b9b3361

Ответ 1

Правильно, наконец, он работал с несколькими интересными моментами.

  • Невозможно создать БД, уже должен существовать
  • Вам нужно создать строку соединения для каждого конкурса БД с использованием имени DBContext (в приведенном выше примере строка соединения должна существовать с именем NerdDinners), а не только по умолчанию (иначе она будет использовать SQL)
  • Он будет использовать имя используемого имени DBS, чтобы определить ваш контекст как имя таблицы, поэтому будьте осторожны при их именовании.

В общем, длинная дорога, но там в конце

** Обновление Еще один момент, который следует учитывать при развертывании вашего сайта MVC с использованием MySQL, вам больше всего хочется добавить DataFactory в ваш web.config. Обычно из-за различий в разъемах MySql и поддерживаемых версиях MySQL. (ответ найден через другие источники после многократного царапин) Просто добавьте:

  <system.data> 
    <DbProviderFactories> 
      <add name="MySQL Data Provider"
           invariant="MySql.Data.MySqlClient"
           description=".Net Framework Data Provider for MySQL"
           type="MySql.Data.MySqlClient.MySqlClientFactory, MySql.Data, Version=6.3.6.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d" /> 
    </DbProviderFactories> 
  </system.data>

В качестве отдельного раздела к вашему web.config убедитесь, что вы установили номер версии из файла MySQL.Data.dll, который вы развертываете на этом сайте (также хорошая идея "скопировать как локальную" MySQL для обеспечения совместимости.

Ответ 2

Еще одна интересная тема: если вы добавите запись "Поставщик данных MySQL" на свой локальный файл machine.config(C:\Windows\Microsoft.NET\Framework\v4.0.30319\Config\machine.config в моем случае), вы может затем подключиться к вашему экземпляру MySql через Visual Studio...

Ответ 3

Этот вопрос и ответ были очень полезны для меня, переносив большой проект EF с SQL на mySQL, поэтому я подумал, что добавлю свои заметки и надеюсь, что они будут полезны:

Как уже отмечалось, имя строки подключения должно совпадать с именем класса, которое расширяет System.Data.Entity.DbContext.

По-видимому, пока еще нет возможности создавать таблицы в EF с помощью соединителя mySQL, но вы можете использовать и изменять сценарии создания SQL для генерации таблиц mySQL. Самый простой способ, который я нашел для этого, - прокомментировать и отключить функцию OnModelCreating в расширенном DbContext в зависимости от того, нужен ли код для воссоздания таблиц. Если я нахожу, что я делаю это чаще, я планирую разрешить это, используя инъекцию зависимостей и иметь отдельные классы на основе конфигурации mySQL или MSSQL.

Мне было проще убедиться, что в dev-блогах и серверах был установлен корректный соединитель mySQL.dll, упакованный в релиз, чем беспорядок с DbFactoryProviders в webconfig. Получение правильной упаковки в пакете сборки проекта/решения означало, что мне нужны строки строки соединения, а не строки DbFactoryProviders, которые, как мне показалось, трудно работать последовательно на нескольких машинах.

Мне нужно было изменить чувствительность регистра идентификатора mySQL от установки, которая у меня была от 0 до 1. Без этого параметра SQL, связанный с EF, не смог найти таблицы, которые были там из-за смешанных имен имен моих объектов, по сравнению с фиксированные таблицы case, которые создает mySQL.