Не найден поставщик 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, но вместо того, чтобы поместить фиктивный код, вы можете сделать это более красивым способом:
Если у вас уже есть класс 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); }
Похоже, что никто не упомянул, сначала проверяя, установлен ли 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. У меня была та же ошибка, когда я пытался получить некоторые записи из таблицы.
Я решил эту проблему, выполнив следующие действия:
- Щелкните правой кнопкой мыши решение и выберите опцию "Управление пакетами NuGet для решения", и появится окно диспетчера пакетов NuGet.
- Перейдите к параметру "Управление" в разделе "Установленные пакеты" СОВЕТ: Entity Framework добавлен в библиотеку классов, поэтому у вас будет EntityFramework в разделе "Установленные пакеты", и вы увидите вариант "Управление"
- Выберите опцию "Управление" и установите флажок, чтобы установить пакет в проект, который имеет ссылку на библиотеку классов, которая содержит модель EF (в моем случае я установил флажок, чтобы установить пакет в консольное приложение, в котором была ссылка на библиотеку классов, в которой была модель EF)
Это все, что я должен был сделать, и все работало идеально.
Надеюсь, это помогло.
Также убедитесь, что ваш стартовый проект - это проект, который содержит ваш dbcontext (или соответствующий app.config). Мой пытался запустить проект веб-сайта, который не имел всех необходимых параметров конфигурации.
У меня такая же проблема (в моем проекте уровня 3-Tire), и я исправил ее, добавив / установив EF в свой основной проект.
Всем нужно ваше внимание, что два dll EntityFramework.dll и EntityFramework.SqlServer.dll являются библиотекой уровня DataAccess. И их использование не логично или любой другой layer.it решает вашу проблему, но это не логично.
логично, что атрибут enitiess удаляет и заменяет их на Fluent API. Это реальное решение
У меня возникла та же проблема, я просто скопировал файл конфигурации приложения из проекта, который содержал DBContext, в мой тестовый проект.