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

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

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

33 ответа

Решение

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

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

PM> Install-Package EntityFramework
514

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

343

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

В итоге:

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

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

185

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

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

105

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

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

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

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

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

45

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

41

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

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

,

20

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

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

private volatile Type _dependency;

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

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

8

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

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

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

4

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

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

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

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

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

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

4

Вы должны принудительно установить статическую ссылку на сборку 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);
    }
    
3

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

3

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

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

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

2

Для запуска проекта, который ссылается на проект, в котором используется 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\
2

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

2

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

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

1

У меня было одно консольное приложение и библиотека классов. В библиотеке классов я создал 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)

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

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

1

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

1

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

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

1

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

var results = _dbContext.MyModel.ToList();

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

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

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

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

1

У меня было выброшено идентичное исключение. я включен

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

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

0

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

0

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

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

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

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

0

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

0

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

0

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

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