Подтвердить что ты не робот

Поставщик службы 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=&quot;data source=|DataDirectory|\FBMultipleOrderSync.sdf&quot;" providerName="System.Data.EntityClient" />
  </connectionStrings>
...

Я попытался переустановить EF 6. Но безрезультатно.

Любая подсказка об этом будет очень заметной.

4b9b3361

Ответ 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 показывает выше сообщение об ошибке, то я просто удаляю и устанавливаю снова.