Подтвердить что ты не робот

Ошибка. Поставщик 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 файлы и снова установил, но для меня ничего не работает. Я продолжаю получать эту ошибку.

4b9b3361

Ответ 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

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

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

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

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