Поставщик Entity Framework не найден для ADO.NET провайдер с инвариантным именем ' System.Данные.В sqlclient'

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

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

enter image description here

30 ответов


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

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

PM> Install-Package EntityFramework

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


вам не нужно устанавливать Entity Framework в консольное приложение, вам просто нужно добавить ссылку на сборку EntityFramework.От SQLServer.файл DLL. Эту сборку можно скопировать из проекта библиотеки классов, использующего Entity Framework, в папку LIB и добавить к ней ссылку.

в итоге:

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

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


вы также можете увидеть это сообщение, если вы забыли включить " EntityFramework.От SQLServer.файл DLL."

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


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

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

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

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

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


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

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/


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

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

.


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

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

private volatile Type _dependency;

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

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


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

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

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

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

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

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

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

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


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


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


добавить ниже в приложение.конфиг.

 <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 файлы сборка, но вместо того, чтобы ставить фиктивный код, вы можете сделать это более красивым способом:

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

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

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

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

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


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

  • EntityFramework.dll файлы
  • EntityFramework.От SQLServer.dll файлы

добавлять <section> до <configSections> of the .файл конфигурации в стартовом проекте делает первую сборку доступной в этом каталоге bin. Вы можете скопировать это из.конфигурационный файл вашей 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\

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


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

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


всем мне нужно ваше внимание, что две dll EntityFramework.DLL и и EntityFramework.От SQLServer.dll-это библиотека слоев DataAccess, и не логично использовать их в представлении или любом другом слое.это решает вашу проблему, но не логично.

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


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

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

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

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

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


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

enter image description here

enter image description here


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

var results = _dbContext.MyModel.ToList();

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

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

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

enter image description here


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


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


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

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

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


Как показывает сообщение, Нам нужно добавить систему поставщика.Данные.SqlClient именно поэтому нам нужно установить пакет NuGet EntityFramework, который имеет две dll, но если мы разрабатываем только консольное приложение, нам просто нужно добавить ссылку на EntityFramework.От SQLServer.dll файлы


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


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


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

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

использование SqlProviderServices = System.Данные.Сущность.От SQLServer.SqlProviderServices;

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