Ошибка. Поставщик ADO.NET не нашел поставщика инфраструктуры Entity Framework с инвариантным именем "System.Data.SqlClient"
Недавно я обновил/обновил Entity Framework в старом проекте с версии 4 или 5 до версии 6. Теперь я получаю это исключение:
Исключение типа "Исключение System.InvalidOperationException" произошло в EntityFramework.dll, но не был обработан в коде пользователя
Дополнительная информация: Поставщик Entity Framework не найден для Поставщик ADO.NET с инвариантным именем "System.Data.SqlClient". Делать убедитесь, что поставщик зарегистрирован в разделе "entityFramework" файл конфигурации приложения. Видеть http://go.microsoft.com/fwlink/?LinkId=260882 для получения дополнительной информации.
Я искал ошибку и наткнулся на пару 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 файлы и снова установил, но для меня ничего не работает. Я продолжаю получать эту ошибку.
Ответы
Ответ 1
Хорошо, это довольно странно. У меня есть несколько проектов: один - проект пользовательского интерфейса (проект 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>
Ответ 2
У меня была эта проблема в ситуации, когда у меня есть модельный проект, который имеет ссылки на EntityFramework и сборки .SqlServer и отдельный проект пользовательского интерфейса, который использует ASP.NET MVC. Я хотел обновиться с EF 4.1 до 6.1.
Я действительно должен был сделать часть того, что было описано здесь: http://robsneuron.blogspot.com/2013/11/entity-framework-upgrade-to-6.html. Я хочу подчеркнуть, что я не добавлял ссылку на эти проекты в свой проект пользовательского интерфейса и не добавлял конфигурацию в проект web.config пользовательского интерфейса, поскольку эти шаги нарушали бы мое разделение проблем.
То, что я делал, было в моем проектном проекте, мне пришлось перевернуть настройки ссылки "Копировать локальные" для EntityFramework.SqlServer(и ссылки EntityFramework, чтобы быть в безопасности) на "False" и сохранить все, чтобы получить проект поместите <Private>
node в файл .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, чтобы попытаться помочь нам преодолеть эту ужасную ошибку.
Ответ 3
У меня такая же проблема, разница в том, что у меня нет доступа к исходному коду.
Я исправил свою проблему, установив правильную версию EntityFramework.SqlServer.dll в каталог bin приложения.
Ответ 4
Я просто решил. Вам необходимо снова установить Entity Framework в ваше решение. Следуйте любым из подходов.
Сначала= Щелкните правой кнопкой мыши корень решения или проекта и нажмите Manage NuGet Packages
. Выберите "EntityFramework", выберите соответствующие проекты и нажмите "ОК".
или
Второй= Перейдите в диспетчер пакетов консоли и запустите Install-Package EntityFramework
.
Надеюсь, что это поможет.
Ответ 5
Ответ Хендри 100% правильный. У меня была та же проблема с моим приложением, где есть проект репозитория, работающий с базой данных с использованием методов, инкапсулирующих работу контекста EF db. Другие проекты используют этот репозиторий, и я не хочу ссылаться на EF в этих проектах. Как-то я не чувствую себя правильно, мне нужен EF только в проекте репозитория.
В любом случае, копирование EntityFramework.SqlServer.dll в другой выходной каталог проекта решает проблему. Чтобы избежать проблем, когда вы забудете скопировать эту DLL, вы можете изменить каталог сборки репозитория. Перейдите в свойства проекта репозитория, выберите вкладку "Сборка", а в разделе "Вывод" вы можете установить выходной каталог в другой каталог сборки проекта.
Конечно, это просто обход. Может быть, взлом, упомянутый в каком-то месте, лучше:
var instance = System.Data.Entity.SqlServer.SqlProviderServices.Instance;
Тем не менее, для целей развития этого достаточно. Позже, при подготовке установки или публикации, вы можете добавить этот файл в пакет.
Я новичок в EF. Есть ли лучший способ решить эту проблему? Мне не нравится "взлом" - это заставляет меня чувствовать, что есть что-то, что "не безопасно".
Ответ 6
Я решил проблему, используя ниже код в моем DBContext
public partial class Q4Sandbox : DbContext
{
public Q4Sandbox()
: base("name=Q4Sandbox")
{
}
public virtual DbSet Employees { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
var instance = System.Data.Entity.SqlServer.SqlProviderServices.Instance;
}
}
Благодаря члену SO.
Ответ 7
Попробуйте добавить следующие привязки сборки выполнения:
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="EntityFramework" publicKeyToken="b77a5c561934e089" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>
Ответ 8
У меня была такая же проблема, и единственное, что работает для меня, - удалить пакет фреймворка сущности из каждого проекта с помощью Uninstall-Package. И затем снова включите его во все решение. Он попросит вас выбрать, в каком проекте вы хотите установить его, вы должны выбрать все.
Ответ 9
Что работало для меня, было понижение с EF 6.1.3
до EF 6.1.1
.
В Visual Studios 2012+
перейдите к:
Инструменты - Диспетчер пакетов Nuget - Консоль диспетчера пакетов
Затем введите:
Install-Package EntityFramework.SqlServerCompact -Version 6.1.1
Мне не нужно было сначала удалить EF 6.1.3
, потому что вышеприведенная команда уже делает это.
Кроме того, я не знаю, что-то сделал, но я также установил SQL Server CE в свой проект.
Здесь ссылка на найденное решение:
http://www.itorian.com/2014/11/no-entity-framework-provider-found-for.html
Ответ 10
Эта проблема может быть вызвана неправильной ссылкой на фреймворк объекта или иногда именем класса, не совпадающим с именем объекта в базе данных. Убедитесь, что имя таблицы совпадает с именем класса.
Ответ 11
У меня также была аналогичная проблема
Моя проблема была решена путем выполнения следующих действий:
![введите описание изображения здесь]()
![введите описание изображения здесь]()