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

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

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

enter image description here

Ответ 1

Я только что попал в ту же проблему, и похоже, что EntityFramework, хотя установленная из NuGet Package Manager, была неправильно установлена ​​в проекте.

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

PM> Install-Package EntityFramework

Ответ 2

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

Ответ 3

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

Вкратце:

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

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

Ответ 4

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

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

Ответ 5

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

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

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

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

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

Ответ 6

Вместо добавления 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/

Ответ 7

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

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

.

Ответ 8

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

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

private volatile Type _dependency;

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

Ответ 9

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

Ответ 10

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

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

Ответ 11

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

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

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

Показания к той же проблеме:

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

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

Ответ 12

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

Ответ 13

Добавьте ниже в свой 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>

Ответ 15

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

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

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

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

Ответ 16

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

Только когда я установил связанные DLL файлы в свойствах Project Project EntityFramework и EntityFramework.SqlServer Copy Local True, он начал работать!

Ответ 17

У меня была связанная с этим проблема при переходе с CE db на Sql Server на Azure. Просто потратил впустую 4 часа, пытаясь решить это. Надеюсь, это может спасти кого-то подобную судьбу. Для меня у меня была ссылка на SqlCE в моем файле package.config. Удаление этой проблемы решило мою проблему и позволило мне использовать миграции. Yay Microsoft для другой технологии с излишне сложными настройками и настройками.

Ответ 18

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

Ответ 19

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

Ответ 20

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

Ответ 21

У меня было то же самое исключение. Я включил

using System.Data; 
using System.Data.Entity;

и все снова работает.

Ответ 22

Как сообщение показывает, что нам нужно добавить поставщика System.Data.SqlClient, поэтому нам нужно установить пакет nuget EntityFramework с двумя dll, но если мы разрабатываем только консольное приложение, нам просто нужно добавить ссылку EntityFramework.SqlServer.dll

Ответ 23

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

Логический способ

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

Ответ 24

Примечание. У меня была эта проблема при создании базы данных Sql из модели. Он создал все таблицы в порядке, но не экспортировал изменения. Вы должны заметить, что эта ошибка возникает при попытке экспортировать sql с использованием шаблона генерации DDL в качестве SSDLtoSQL10. Он ожидает подключения MySQL здесь, поэтому убедитесь, что вы выбрали из раскрывающегося шаблона генерации DDL SSDLtoMySQL свойства Model. Провел целый день на этом!

Ответ 25

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

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

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

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

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

Ответ 26

В моем случае все работало правильно, а затем внезапно перестало работать, потому что я думаю, что Resharper изменил некоторые изменения, которые вызвали проблему. Мой проект был разделен на слой данных, уровень обслуживания и презентации. Я установил инфраструктуру Entity и ссылался на свой уровень данных, но все же ошибка не исчезла. Деинсталляция и переустановка не работали. Наконец, я решил его сделать слой данных проектом Startup, выполнить миграцию, обновить базу данных и изменить проект Startup на мой уровень представления.

Ответ 27

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

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

с использованием SqlProviderServices = System.Data.Entity.SqlServer.SqlProviderServices;

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

Ответ 28

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

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

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