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

После загрузки EF6 с помощью nuget и попытки запустить мой проект, он возвращает следующую ошибку:

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

35 ответов

Решение

Я только что попал в ту же проблему, и это выглядит как EntityFramework, хотя установленный из диспетчера пакетов NuGet не был правильно установлен в проекте.

Мне удалось это исправить, выполнив следующую команду в консоли диспетчера пакетов:

PM> Install-Package EntityFramework

Вы добавили EF в проект библиотеки классов. Вам также нужно добавить его в проект, который ссылается на него (ваше консольное приложение, веб-сайт или что-то еще).

Вам не нужно устанавливать Entity Framework в вашем консольном приложении, вам просто нужно добавить ссылку на сборку EntityFramework.SqlServer.dll. Вы можете скопировать эту сборку из проекта библиотеки классов, который использует Entity Framework, в папку LIB и добавить ссылку на нее.

В итоге:

  • Приложение библиотеки классов:
    • Установить Entity Framework
    • Напишите свой код слоя данных
    • Файл app.config имеет всю конфигурацию, связанную с Entity Framework, кроме строки подключения.
  • Создайте консольное, веб-или настольное приложение:
    • Добавьте ссылку на первый проект.
    • Добавьте ссылку на EntityFramework.SqlServer.dll.
    • В app.config/web.config есть строка подключения (помните, что имя записи конфигурации должно совпадать с именем класса DbContext.

Я надеюсь, что это помогает.

Вы также можете увидеть это сообщение, если забыли включить "EntityFramework.SqlServer.dll".

Похоже, это недавно добавленный файл в EF6. Первоначально я не включил его в свой модуль слияния и столкнулся с проблемой, перечисленной здесь.

Вместо добавления EntityFramework.SqlServer в хост-проект вы можете обеспечить статическую ссылку на него из вашего проекта Model/entity, подобного этому

static MyContext()
{
    var type = typeof(System.Data.Entity.SqlServer.SqlProviderServices);
    if(type == null)
        throw new Exception("Do not remove, ensures static reference to System.Data.Entity.SqlServer");
}

Это сделает процесс сборки включающим сборку с хост-проектом.

Больше информации в моем блоге http://andersmalmgren.com/2014/08/20/implicit-dependencies-and-copy-local-fails-to-copy/

Когда вы устанавливаете Entity Framework 6 через Nuget, EntityFramework.SqlServer иногда пропускает другой исполняемый файл. Просто добавьте Nuget пакет к этому проекту.

Иногда выше не работает для тестового проекта

Чтобы решить эту проблему в тестовом проекте, просто поместите этот метод в тестовый проект:

public void FixEfProviderServicesProblem()
{
    var instance = System.Data.Entity.SqlServer.SqlProviderServices.Instance;
}

Этот метод никогда не вызывался, но, по моим наблюдениям, компилятор удалит все "ненужные" сборки и без использования EntityFramework.SqlServer материал тест не проходит.

Добавить эту функцию

private void FixEfProviderServicesProblem()

в контекстный класс базы данных в классе библиотеки и отсутствующая DLL EntityFramework.SqlServer.dll будет скопирована в правильные места.

namespace a.b.c
{
    using System.Data.Entity;

    public partial class WorkflowDBContext : DbContext
    {
        public WorkflowDBContext()
            : base("name=WorkflowDBConnStr")
        {
        }

        public virtual DbSet<WorkflowDefinition> WorkflowDefinitions { get; set; }
        public virtual DbSet<WorkflowInstance> WorkflowInstances { get; set; }
        public virtual DbSet<EngineAlert> EngineAlerts { get; set; }
        public virtual DbSet<AsyncWaitItem> AsyncWaitItems { get; set; }
        public virtual DbSet<TaskItem> TaskItems { get; set; }
        public virtual DbSet<TaskItemLink> TaskItemLinks { get; set; }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
        }

        private void FixEfProviderServicesProblem()
        {
            // The Entity Framework provider type 'System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer'
            // for the 'System.Data.SqlClient' ADO.NET provider could not be loaded. 
            // Make sure the provider assembly is available to the running application. 
            // See http://go.microsoft.com/fwlink/?LinkId=260882 for more information.
            var instance = System.Data.Entity.SqlServer.SqlProviderServices.Instance;
        }
    }
}

,

Ничто из этого не помогло мне. Я нашел решение в другом вопросе stackru. Я добавлю это здесь для удобства:

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

private volatile Type _dependency;

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

Для запуска проекта, который ссылается на проект, в котором используется Entity Framework, необходимы следующие две сборки в папке bin:

  • EntityFramework.dll
  • EntityFramework.SqlServer.dll

Добавление <section> к <configSections> файла.config в проекте запуска делает первую сборку доступной в этом каталоге bin. Вы можете скопировать это из файла.config вашего проекта Entity Framework:

<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>

Чтобы сделать второй DLL-файл доступным в папке bin, хотя это и нецелесообразно, можно сделать ручную копию из папки bin проекта Entity Framework. Лучшая альтернатива - добавить к событиям после сборки проекта Entity Framework следующие строки, которые автоматизируют процесс:

cd $(ProjectDir)
xcopy /y bin\Debug\EntityFramework.SqlServer.dll ..\{PATH_TO_THE_PROJECT_THAT_NEEDS_THE_DLL}\bin\Debug\

Я получил ту же ошибку при использовании Entity Framework 6 с SQL Server Compact 4.0. Статья по MSDN для провайдеров Entity Framework для EF6 оказалась полезной. Выполнение соответствующих команд провайдера в виде пакетов nuget на консоли диспетчера пакетов может решить проблему, так как пакеты NuGet автоматически добавят регистрации в файл конфигурации. Я побежал PM> Install-Package EntityFramework.SqlServerCompact решить проблему.

Когда ошибка возникает в тестовых проектах, самое красивое решение - украсить тестовый класс:

[DeploymentItem("EntityFramework.SqlServer.dll")]

Сегодня столкнулся с этой проблемой при работе с набором веб-сервисов, каждый в разных проектах, и отдельным проектом, содержащим интеграционные тесты для некоторых из этих сервисов.

Я использовал эту настройку в течение некоторого времени с EF5, без необходимости включать ссылки на EF из Интеграционного тестового проекта.

Теперь, после обновления до EF6, мне кажется, мне нужно включить ссылку на EF6 и в проект интеграционного тестирования, даже если он там не используется (в значительной степени, как указано выше пользователем 3004275).

Признаки того, что вы столкнулись с той же проблемой:

  • Вызовы непосредственно в EF (подключение к БД, получение данных и т. Д.) Работают нормально, если они инициируются из проекта, который имеет ссылки на EF6.
  • Звонки в сервис через опубликованный интерфейс сервиса работают нормально; т.е. в сервисе отсутствуют пропущенные ссылки "внутри".
  • Вызовы напрямую из открытых методов в сервисном проекте, из проекта вне сервиса, вызовут эту ошибку, даже если EF не используется в этом проекте; только внутри в вызываемом проекте

Третий момент - это то, что меня оттолкнуло на некоторое время, и я до сих пор не уверен, зачем это нужно. Добавление ссылки на EF6 в моем проекте Integration Test решило это в любом случае...

Добавьте ниже в ваш app.config.

 <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>

Вам просто не хватает ссылки на EntityFramework.SqlServer.dll. Для проектов EntityFramework, использующих SQL Server, необходимо указать два файла: EntityFramework.SqlServer.dll и EntityFramework.dll

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

Я просто столкнулся с этой проблемой сегодня. У меня есть библиотека классов репозитория данных с пакетом EF63 NuGet и консольное приложение для тестирования, которые имеют ссылку только на проект библиотеки классов. Я создал очень простую команду после сборки, которая копирует EntityFramework.SqlServer.dll из папки Bin\Debug библиотеки классов в папку Bin\Debug консольного приложения, и проблема решена. Не забудьте добавить раздел entityFramework в файл.config консольного приложения.

Просто скопируйте EntityFramework.SqlServer.dll в папку bin

Вы должны принудительно установить статическую ссылку на сборку EntityFramework.SqlServer.dll, но вместо того, чтобы поместить фиктивный код, вы можете сделать это более красивым способом:

  1. Если у вас уже есть класс DbConfiguration:

    public class MyConfiguration : DbConfiguration
    {
        public MyConfiguration()
        {
            this.SetProviderServices(System.Data.Entity.SqlServer.SqlProviderServices.ProviderInvariantName, System.Data.Entity.SqlServer.SqlProviderServices.Instance);
        }
    }
    
  2. Если у вас нет класса DbConfiguration, вы должны поместить следующий код при запуске приложения (до использования EF):

    static MyContext()
    {
        DbConfiguration.Loaded += (sender, e) =>
            e.ReplaceService<DbProviderServices>((s, k) => System.Data.Entity.SqlServer.SqlProviderServices.Instance);
    }
    

Удаление BIN-папки сделало это для меня

Похоже, что никто не упомянул, сначала проверяя, установлен ли System.Data.SqlClient в системе и делается ли на него ссылка.

я решил свою проблему, установив System.Data.SqlClient и добавив нового поставщика в app.Config

<provider invariantName="System.Data.SQLite" type="System.Data.SQLite.EF6.SQLiteProviderServices, System.Data.SQLite.EF6"/>

Разверните файл YourModel.edmx и откройте класс YourModel.Context.cs в YourModel.Context.tt.

Я добавил следующую строку в раздел использования, и ошибка была исправлена ​​для меня.

using SqlProviderServices = System.Data.Entity.SqlServer.SqlProviderServices;

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

Я только что переустановил Entity Framework, используя Nuget. И следуйте инструкциям, написанным по ссылке ниже: http://robsneuron.blogspot.in/2013/11/entity-framework-upgrade-to-6.html

Я думаю, что проблема будет решена.

У меня такая же ошибка. Странно, что это происходит только всякий раз, когда я использую свой dbContext, чтобы запросить любую из моих моделей или получить ее список, например:

var results = _dbContext.MyModel.ToList();

Мы попытались переустановить Entity Framework, ссылаться на него правильно, но безрезультатно.

К счастью, мы попытались проверить Nuget для ALL решения, затем обновите все или убедитесь, everything это та же версия, потому что мы заметили, что два проекта имеют разные версии EF в веб-проекте. И это работает. Ошибка ушла.

Вот скриншот о том, как управлять Nuget для всех решений:

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

Просто установите пакет EntityFramework в ваш веб / консольный проект. Это должно добавить раздел в ваш конфигурационный файл.

Я перепробовал почти все вышеперечисленное и ничего не получалось.

Только когда я устанавливаю указанные библиотеки DLL в проекте по умолчанию EntityFramework а также EntityFramework.SqlServer свойства Copy Local в True это начало работать!

У меня было одно консольное приложение и библиотека классов. В библиотеке классов я создал Entity Data Model (щелкните правой кнопкой мыши Class Library > Add > New Item > Data > ADO.NET Entity Data Model 6.0) и поместил ссылку в консольное приложение. Итак, у вас есть консольное приложение, которое имеет ссылку на библиотеку классов, а внутри библиотеки классов у вас есть модель EF. У меня была та же ошибка, когда я пытался получить некоторые записи из таблицы.

Я решил эту проблему, выполнив следующие действия:

  1. Щелкните правой кнопкой мыши решение и выберите опцию "Управление пакетами NuGet для решения", и появится окно диспетчера пакетов NuGet.
  2. Перейдите к параметру "Управление" в разделе "Установленные пакеты" СОВЕТ: Entity Framework добавлен в библиотеку классов, поэтому у вас будет EntityFramework в разделе "Установленные пакеты", и вы увидите вариант "Управление"
  3. Выберите опцию "Управление" и установите флажок, чтобы установить пакет в проект, который имеет ссылку на библиотеку классов, которая содержит модель EF (в моем случае я установил флажок, чтобы установить пакет в консольное приложение, в котором была ссылка на библиотеку классов, в которой была модель EF)

Это все, что я должен был сделать, и все работало идеально.

Надеюсь, это помогло.

Также убедитесь, что ваш стартовый проект - это проект, который содержит ваш dbcontext (или соответствующий app.config). Мой пытался запустить проект веб-сайта, который не имел всех необходимых параметров конфигурации.

У меня такая же проблема (в моем проекте уровня 3-Tire), и я исправил ее, добавив / установив EF в свой основной проект.

Всем нужно ваше внимание, что два dll EntityFramework.dll и EntityFramework.SqlServer.dll являются библиотекой уровня DataAccess. И их использование не логично или любой другой layer.it решает вашу проблему, но это не логично.

логично, что атрибут enitiess удаляет и заменяет их на Fluent API. Это реальное решение

У меня возникла та же проблема, я просто скопировал файл конфигурации приложения из проекта, который содержал DBContext, в мой тестовый проект.

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