Поставщик службы Entity Framework не найден для поставщика ADO.NET с инвариантным именем "System.Data.SqlServerCe.4.0"
У меня возникла следующая ошибка, когда я использовал sqlce 4.0 с entityframework 6.0
No Entity Framework provider found for the ADO.NET provider with invariant name 'System.Data.SqlServerCe.4.0'
Мой app.config выглядит следующим образом
....
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" requirePermission="false" />
<section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
<!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
<!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 --></configSections>
<entityFramework>
<defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" >
<parameters>
<parameter value =" System.Data.SqlServerCe.4.0" />
</parameters>
</defaultConnectionFactory>
<!--providers>
<provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
</providers-->
</entityFramework>
<connectionStrings>
<add name="FbMultipleInsOrderContainer" connectionString="metadata=res://*/FbMultipleInsOrder.csdl|res://*/FbMultipleInsOrder.ssdl|res://*/FbMultipleInsOrder.msl;provider=System.Data.SqlServerCe.4.0;provider connection string="data source=|DataDirectory|\FBMultipleOrderSync.sdf"" providerName="System.Data.EntityClient" />
</connectionStrings>
...
Я попытался переустановить EF 6. Но безрезультатно.
Любая подсказка об этом будет очень заметной.
Ответы
Ответ 1
После установки пакета EntityFramework.SqlServerCompact nuget проверьте, что ваш файл app.config содержит следующее (в соответствии с вышеприведенным комментарием @ErikEJ):
<providers>
<provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
<provider invariantName="System.Data.SqlServerCe.4.0" type="System.Data.Entity.SqlServerCompact.SqlCeProviderServices, EntityFramework.SqlServerCompact" />
</providers>
(Вы можете оставить строку для SqlClient, даже если она вам действительно не нужна.)
Ответ 2
ErikEJ указал на это, но я хотел бы подчеркнуть тот факт, что вы ДОЛЖНЫ помнить об установке пакета Nuget
EntityFramework.SqlServerCompact
Я попробовал следовать рекомендованному ответу, но не понял, что у меня не было нужного пакета NuGet, на который ссылался App.config.
Ответ 3
Для этого вам просто нужно зарегистрировать EntityFramework.SqlServerCompact
в консоли диспетчера пакетов,
Для этого откройте консоль диспетчера мощности и введите команду ниже:
PM> Install-Package EntityFramework.SqlServerCompact
Ответ 4
Я встретил проблему в своих модульных тестах. Трудность в том, что ошибка появилась не постоянно.
Мне удалось решить эту проблему, добавив класс follwing my my unit testing solution:
public static class Trick
{
public static void FixEfProviderServicesProblem()
{
// this commented line should be used for SQL Server provider
//var instance = System.Data.Entity.SqlServer.SqlProviderServices.Instance;
// this is used for SQL Server CE provider
var instance = System.Data.Entity.SqlServerCompact.SqlCeProviderServices.Instance;
}
}
Ответ 5
Моя проблема была в модульных тестах. Вероятно, вы только установили инфраструктуру Entity для своего проекта, но не ваши модульные тесты. Для этого:
Щелкните правой кнопкой мыши "Решение" в обозревателе решений (не на имя вашего проекта)
Нажмите "Управление пакетами NuGet"
Найдите EntityFramework и нажмите его
Вероятно, вы не увидите галочку рядом с [Project Name].Tests
Ответ 6
Эта ошибка возникла на ПК пользователя. Пользователь проигнорировал предыдущую ошибку. "Раздел" DbProviderFactories "может появляться только один раз в файле конфигурации".
По-видимому, DB2 повредила файл конфигурации машины на своем ПК, добавив повторяющийся (и пустой) тег <DbProviderFactories />
.
Решение заключалось в удалении пустого повторяющегося тега. Файл конфигурации машины находится в папке [WindowsDir]\Microsoft.Net\Framework [.NET Version]\Config\Machine.config
Ответ 7
Чтобы решить эту проблему
Меню Visual Studio → Инструменты → Диспетчер пакетов NuGet → Управление пакетами NuGet для решения
Выберите вкладку "Обзор" и выполните поиск следующего "EntityFramework.SqlServerCompact"
Установите его.
Он должен работать.
Ответ 8
Не забывайте, что консоль диспетчера пакетов принимает app.config/web.config из выбранного проекта запуска!
Ответ 9
данное решение является правильным, но не объясняет, почему EF нуждается в этой сборке. Вот почему...
По умолчанию конфигурация EF позволяет вам иметь раздел "entityConnectionFactory" uder entityFramework. Этот параметр по умолчанию factory настроен на "LocalDbConnectionFactory", а его параметр "mssqllocaldb".
Этот factory внутренне требует "SqlServerCe.4.0", то есть "SqlServerCompact".
Ошибка происходит только в том случае, если EF использует свою строку подключения по умолчанию в DbContext. Если EF снабжен некоторой другой указанной строкой Connection в вашей конфигурации, эта ошибка не появляется. Поскольку EF по умолчанию использует соединение по умолчанию factory.
После установки "SqlServerCe 4.0" конфигурация EF изменяется, а "LocalDbConnectionFactory" и ее параметр "mssqllocaldb" заменяются "SqlServer Ce 4.0". и среда исполнения EF также может найти сборку SqlServerCe4.0 (так как теперь она является частью ваших ссылок и физически помещена в ваш BIN).
Ниже приведена конфигурация EF до и после установки Sql Server Compact
OLD Config:
<entityFramework>
<defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
<parameters>
<parameter value="mssqllocaldb" />
</parameters>
</defaultConnectionFactory>
<providers>
<provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
</providers>
</entityFramework>
Новая конфигурация выглядит следующим образом:
<entityFramework>
<defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlCeConnectionFactory, EntityFramework">
<parameters>
<parameter value="System.Data.SqlServerCe.4.0" />
</parameters>
</defaultConnectionFactory>
<providers>
<provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
<provider invariantName="System.Data.SqlServerCe.4.0" type="System.Data.Entity.SqlServerCompact.SqlCeProviderServices, EntityFramework.SqlServerCompact" />
</providers>
</entityFramework>
а также добавил следующий раздел, чтобы описать новый Factory
<system.data>
<DbProviderFactories>
<remove invariant="System.Data.SqlServerCe.4.0" />
<add name="Microsoft SQL Server Compact Data Provider 4.0" invariant="System.Data.SqlServerCe.4.0" description=".NET Framework Data Provider for Microsoft SQL Server Compact" type="System.Data.SqlServerCe.SqlCeProviderFactory, System.Data.SqlServerCe, Version=4.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91" />
</DbProviderFactories>
</system.data>
Ответ 10
Для меня, потому что программист - это не только один, то какой-то программист уже устанавливает EntityFramework.SqlServerCompact, но когда я вытягиваю свой компьютер, а RUN показывает выше сообщение об ошибке, то я просто удаляю и устанавливаю снова.