Entity Framework ищет поставщика ADO.NET SqlServerCe.3.5 вместо 4.0

Я использую SQL Server CE 4.0 вместе с Entity Framework 6.0. Все работало нормально, пока я не захотел включить механизм синхронизации N-уровня с удаленной базой данных, используя службу WCF и Sync Framework 2.1.

Я следовал этому руководство и используйте обходной путь JTune для решения проблемы, связанной с тем, что совместимость SyncFramework 2.1 и SQLSErverCompactCE 4.0 не поддерживается. Это просто перенаправление привязки во время выполнения в app.config для System.Data.SqlServerCE.dll 4.0.0.

Затем я получаю следующий файл App.config

<?xml version="1.0" encoding="utf-8"?>
<configuration>

  <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>
  <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>
  <connectionStrings>
    <add name="Entities" connectionString="metadata=res://*/Persistence.Model1.csdl|res://*/Persistence.Model1.ssdl|res://*/Persistence.Model1.msl;provider=System.Data.SqlServerCe.4.0;provider connection string=&quot;data source=|DataDirectory|\XXXX.sdf&quot;" providerName="System.Data.EntityClient" />
  </connectionStrings>
  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="System.Data.SqlServerCe" publicKeyToken="89845DCD8080CC91" culture="neutral"/>
        <bindingRedirect oldVersion="0.0.0.0-4.0.0.0" newVersion="4.0.0.0"/>
      </dependentAssembly>
    </assemblyBinding>
  </runtime>
<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>
</configuration>

Он отлично работает в некоторых конфигурациях, но может привести к следующей ошибке.

 No Entity Framework provider found for the ADO.NET provider with invariant name 'System.Data.SqlServerCe.3.5'. Make sure the provider is registered in the 'entityFramework' section of the application config file. See http://go.microsoft.com/fwlink/?LinkId=260882 for more information.

Обратите внимание, что решение, представленное в этот вопрос нецелесообразен, потому что в моей ситуации мне действительно нужно перенаправление привязки для использования SyncFramework.

Есть ли способ указать Entity Framework не искать поставщика SQL Server CE 3.5, а только 4.0?


comment
Попробуйте с: ‹bindingRedirect oldVersion=4.0.0.0-4.0.0.0 newVersion=4.0.0.0/›   -  person ErikEJ    schedule 09.04.2015
comment
Также посмотрите на мою запись в блоге, включая комментарии в блоге erikej.blogspot.dk/2014/10/   -  person ErikEJ    schedule 09.04.2015
comment
Скорее всего, лучшим вариантом будет потребовать удаления 3.5.. :-(   -  person ErikEJ    schedule 09.04.2015
comment
Большое спасибо, ‹bindingRedirect oldVersion=4.0.0.0-4.0.0.0 newVersion=4.0.0.0/› решает проблему с поставщиком Entity Framework, но мы возвращаем исключение Invalid cast см. сообщение JTune   -  person Benoit Patra    schedule 09.04.2015
comment
Вы пробовали перенаправление привязки в сообщении junet?   -  person ErikEJ    schedule 09.04.2015
comment
Да, я это сделал, и это выглядит нормально, когда поблизости нет SQLServerCE 3.5. Ошибки кажутся случайными в конфигурации, когда они есть. Кроме того, я также сталкиваюсь с проблемами с самой SyncFramework :-(   -  person Benoit Patra    schedule 09.04.2015
comment
Хорошо, я могу систематически воспроизводить ошибку. Если у вас установлен SQL Server, то для воспроизведения убедитесь, что в вашем файле machine.config поставщик SQLServerCE 35 предшествует SQLServerCE 40.   -  person Benoit Patra    schedule 09.04.2015


Ответы (1)


Думаю, я получил это. Когда на машине установлен SQL Server CE 3.5, он добавляется в DbProviders в файле machine.config, и в зависимости от его положения относительно версии 4.0 у вас может возникнуть сбой (см. мой комментарий выше). Похоже, что app.config позволяет вам удалить DbProviderFactory. Я добавил следующую строку в свой app.config, и проблема, похоже, решена.

<system.data>
  <DbProviderFactories>
    <remove invariant="System.Data.SqlServerCe.3.5" />
  </DbProviderFactories>
</system.data>
person Benoit Patra    schedule 09.04.2015
comment
А какой сейчас у вас редирект привязки? - person ErikEJ; 09.04.2015
comment
Я сохранил это ‹bindingRedirect oldVersion=0.0.0.0-4.0.0.0 newVersion=4.0.0.0/› - person Benoit Patra; 09.04.2015
comment
Отличная информация, я могу использовать ее для улучшения моего пакета nuget для частного развертывания EF! - person ErikEJ; 09.04.2015