Использование 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, выпущенном только на прошлой неделе. Тем не менее, есть ли что-то, что я делаю неправильно здесь, или известная проблема, с которой можно работать?
Ответы
Ответ 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.