Ошибка. Поставщик ADO.NET не нашел поставщика инфраструктуры Entity Framework с инвариантным именем «System.Data.SqlClient»

.net ado.net c# entity-framework entity-framework-6

Вопрос

Недавно я обновил / обновил Entity Framework в старом проекте с версии 4 или 5 до версии 6. Теперь я получаю это исключение:

Исключение типа «System.InvalidOperationException» произошло в EntityFramework.dll, но не было обработано в коде пользователя

Дополнительная информация: Поставщик ADO.NET не найден провайдер Entity Framework с инвариантным именем «System.Data.SqlClient». Убедитесь, что провайдер зарегистрирован в разделе «entityFramework» файла конфигурации приложения. Дополнительную информацию см. На странице http://go.microsoft.com/fwlink/?LinkId=260882 .

Я googled ошибка и наткнулся на пару SO-потоков, но ни один из них не содержал решение, которое работает для меня. Вот как выглядит мой App.config:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
    <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
  </configSections>
  <entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" />
    <providers>
      <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
    </providers>
  </entityFramework>
</configuration>

Я уже удалил Entity Framework из моего проекта и снова установил его, удалил все ссылки на старые EF-файлы и снова установил, но для меня ничего не работает. Я продолжаю получать эту ошибку.

Принятый ответ

Хорошо, это довольно странно. У меня есть несколько проектов: один - проект пользовательского интерфейса (проект ASP.NET MVC), а другие - проекты для таких вещей, как репозитории. Проект репозитория имел ссылку на EF, но проект пользовательского интерфейса не сделал (потому что он не нуждался в нем, ему просто нужно было ссылаться на другие проекты). После того, как я установил EF для проекта пользовательского интерфейса, все начало работать. Вот почему он добавил этот кусок кода в мой Web.config:

<entityFramework>
  <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" />
  <providers>
    <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
  </providers>
</entityFramework>

Популярные ответы

У меня была эта проблема в ситуации, когда у меня есть модельный проект, который имеет ссылки как на EntityFramework, так и на сборки .SqlServer, а также на отдельный проект пользовательского интерфейса, который использует ASP.NET MVC. Я хотел обновиться с EF 4.1 до 6.1. Я действительно должен был сделать часть того, что было описано здесь: http://robsneuron.blogspot.com/2013/11/entity-framework-upgrade-to-6.html . Я хочу подчеркнуть, что я не добавлял ссылку на эти проекты в свой проект пользовательского интерфейса и не добавлял конфигурацию в web.config проекта UI, так как эти шаги нарушали бы мое разделение проблем.

То, что я действительно делал, было в моем проектном проекте, мне пришлось перевернуть настройки ссылки «Копировать локальные» для EntityFramework.SqlServer (и ссылки EntityFramework, чтобы быть в безопасности) на «False» и сохранить все, чтобы проект запустил <Private> в файл .csproj, а затем верните его в «True» и сохраните снова, так что True вернется в качестве конечного значения.

Мне также пришлось добавить строку hack в класс DbContext -derived в своем конструкторе, чтобы принудительно использовать сборку, хотя строка ничего не делает. Оба этих шага я узнал из сообщения в блоге.

public MyContext : DbContext
{
    public MyContext() : base("name=MyContext")
    {
        // the terrible hack
        var ensureDLLIsCopied = 
                System.Data.Entity.SqlServer.SqlProviderServices.Instance;   
    }

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




Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему