Не найден поставщик 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, чтобы каждый раз при публикации Приложение будет скопировано в опубликованную папку.