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

Контекст .NET MySQL конфликтует с DbProviderFactories

Я использую Контекст .NET MySQL с Entity Framework 4, и все отлично поработало, но я хотел упаковать файлы DLL клиента MySQL с моим приложением при развертывании на серверах, поэтому нам не нужно беспокоиться об установке mysql on каждый сервер, каждое приложение будет иметь только нужную копию.

Чтобы сделать это возможным, я убедился, что ссылки MySQL имеют "Копировать локальную", поэтому они будут скопированы в папки bin и добавлены следующее в мой app.config:

<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.7.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d" />
    </DbProviderFactories>
</system.data>

Это работает, и я могу развернуть приложение без установки mysql на удаленном сервере, но теперь у меня есть проблема на моей локальной машине dev (где у меня есть установленный соединитель MySQL), и я получаю эту ошибку когда EF пытается подключиться:

Столбец "InvariantName" ограничен уникальным. Стоимость "MySql.Data.MySqlClient" уже присутствует.

Если я прокомментирую XML, добавленный выше в app.config, ошибка исчезнет. Вероятно, это связано с тем, что один и тот же драйвер установлен в системе и находится в файле machine.config.

Какое решение? Я бы предпочел не комментировать и раскомментировать строку в зависимости от того, для какой системы я создаю приложение.

4b9b3361

Ответ 1

попробуйте добавить < удалите инвариант = "MySql.Data.MySqlClient" /" > в вашем webconfig. На вашем компьютере вы установили Connector for MySql, и ваш файл machine.config был изменен путем добавления элемента в DbProviderFactories. Поэтому, если вы поместите другого поставщика данных MySql в свой web.config, вам понравится, если вы попытаетесь зарегистрировать одно и то же дважды.

<system.data>
    <DbProviderFactories>
      <remove invariant="MySql.Data.MySqlClient" />
      <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.7.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d" />
    </DbProviderFactories>
</system.data>

Ответ 2

Вы также можете скопировать все DLL файлы mysql из C:\Program Files (x86)\MySQL\MySQL Connector Net 6.8.3\Assemblies\v4.0 в папку проекта bin. Таким образом, EF6 может достичь всех необходимых подклассов MySQL (MySql.Data).