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

Мы используем EntityFramework 6 с кодом 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 пытается запустить script

context.Database.ExecuteSqlCommand(script.ScriptText)

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

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

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

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

Любые идеи?

Ответ 1

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

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

private volatile Type _dependency;

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

Ответ 2

У вас есть сборка EntityFramework.SqlServer.dll в вашем пути к программе? У меня была та же проблема и после копирования dll в путь приложения каждый Thing работал нормально.

Ответ 4

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

Ответ 5

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

Ответ 6

Для меня оказалось, что ссылка моего провайдера в файле 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>

Ответ 7

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

Ответ 8

Я обычно добавляю EntityFramework в веб-проект, а также сборку, которая на самом деле ссылается на нее.

Ответ 9

У меня также была аналогичная проблема

Моя проблема была решена путем выполнения следующих действий: введите описание изображения здесь

введите описание изображения здесь