Использование MySql с Entity Framework 4 и CTP-кодом для разработки кода - PullRequest
29 голосов
/ 19 июля 2010

Я подумал, что немного поэкспериментирую с последним постом Скотта Гатри о разработке кода с помощью 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 автоматически сгенерирует для меня БД. Вместо этого он генерирует исключение ProviderIncompatibleException, с внутренним исключением, жалующимся на то, что база данных NerdDinners не существует.

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

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

Ответы [ 3 ]

26 голосов
/ 07 февраля 2011

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

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

В общем, долгий путь, но в конце концов

** Обновление Еще один момент, на который следует обратить внимание: при развертывании сайта 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 DLL для обеспечения совместимости.

2 голосов
/ 06 декабря 2011

Этот вопрос и ответ был очень полезен для меня при переносе более крупного проекта 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, не мог найти таблицы, которые были там из-за смешанных имен падежей моих объектов по сравнению с таблицы с фиксированным регистром, которые создает MySQL.

2 голосов
/ 30 мая 2011

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

...