Не найден поставщик Entity Framework для поставщика ADO.NET с инвариантным именем System.Data.SqlClient.

Мы используем EntityFramework 6 с Code First. У нас есть консольное приложение, которое не имеет ссылки на EntityFramework, но считывает строку подключения из его App.config. Он вызывает сборку DatabaseInitializationUtilities, передавая строку подключения в качестве параметра.

DatabaseInitializationUtilities имеет ссылку на EF6 (EntityFramework и EntityFramework.SqlServer). Его 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>
     <system.serviceModel>
         <bindings>
            <basicHttpBinding>
                <binding name="BasicHttpBinding_IAuthentication" />
            </basicHttpBinding>
         </bindings>
         <client>
            <endpoint address="http://localhost/SecurityServices/Authentication.svc" binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IAuthentication" contract="SecurityService.IAuthentication" name="BasicHttpBinding_IAuthentication" />
         </client>
      </system.serviceModel>
      <entityFramework>
         <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
            <parameters>
               <parameter value="v11.0" />
            </parameters>
         </defaultConnectionFactory>
         <providers>
            <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
         </providers>
      </entityFramework>
   </configuration>

Когда выполнение достигает строки, где DatabaseInitializationUtilities пытается запустить скрипт

context.Database.ExecuteSqlCommand(script.ScriptText)

ошибка выдается:

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

Я считаю, что это именно то, что у меня есть в моем конфигурационном файле, поэтому я не понимаю проблемы.

ПРИМЕЧАНИЕ: Resharper делает паузу на узле и сообщает: "Элемент EntityFramework имеет недопустимый дочерний элемент" поставщики ". Однако этот раздел был внедрен NuGet, когда я установил EF6.

Есть идеи?

10 ответов

Вам нужно создать ссылку, чтобы она была скопирована в папку отладки. Так что позже он может быть доступен во время выполнения.

Не копируйте файлы, просто создайте эту ссылку:

private volatile Type _dependency;

public MyClass()
{
    _dependency = typeof(System.Data.Entity.SqlServer.SqlProviderServices);
}

У вас есть сборка EntityFramework.SqlServer.dll в вашем пути приложения? У меня была та же проблема, и после копирования DLL в путь к приложению все работало нормально.

Наконец-то нашел ответ в этом блоге:

http://robsneuron.blogspot.com/2013/11/entity-framework-upgrade-to-6.html

У меня тоже была эта пробема. Все работало локально, когда я запустил свое приложение.net mvc, но когда я его опубликовал, я получил эту ошибку. Проблема заключалась в том, что мне нужно было ссылаться на EntityFrameworl.SqlServer также в моем веб-проекте, хотя у меня был отдельный проект для данных. Что странно, так это то, что эта ошибка появлялась только при публикации приложения. Это серьезная ошибка, вероятно, от Microsoft. Я использовал EF 6.1.1.

Это потому что EntityFramework.SqlServer.dllне копируется в ваш проект. Добавьте эту DLL, и она, надеюсь, сработает. Вы можете найти это в проекте, где вы добавили модель данных.

Для меня оказалось, что ссылка моего провайдера в файле web.config была неверной. Я полагаю, что пакет nuget может неправильно включать провайдера.

Я заменил моего провайдера этим, и это сработало:

  <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.dll" в папку bin проекта решит вашу проблему.

Я склонен добавлять EntityFramework к веб-проекту, а также к сборке, которая фактически ссылается на него.

Лучший способ справиться с такой проблемой - это включить в ваш проект ссылочный файл EntityFramework.SqlServer.dll. Нажмите клавишу F4 (оп. Свойства) и измените свойство на Копировать на Local =True, чтобы каждый раз при публикации Приложение будет скопировано в опубликованную папку.

Другие вопросы по тегам