Вопрос

Я использую Entity Framework 4 в настольном приложении с SQL Compact.Я хочу использовать частная установка SQL Compact с моим приложением, чтобы мой установщик мог установить SQL Compact, не требуя от пользователя повторной установки.Это также позволяет избежать проблем с версиями в будущем.

На моей машине разработки установлен общедоступный пакет SQL Compact 3.5 SP1, поэтому мое приложение там работает нормально, как и следовало ожидать.Но он не работает на моей тестовой машине, на которой не установлен SQL Compact.Я получаю эту ошибку:

The specified store provider cannot be found in the configuration, or is not valid.

Я знаю, что у некоторых людей возникают трудности с частной установкой SQL Compact, но Я использовал их некоторое время, и они мне очень нравятся.К сожалению, мой обычный подход к частной установке не работает.Я проверил номера версий файлов SQL CE и обнаружил, что все они — 3.8.8078.0, что является версией SP2 RC.

Вот файлы, которые я включил в свою частную установку:

  • sqlcecompact35.dll
  • sqlceer35EN.dll
  • sqlceme35.dll
  • sqlceqp35.dll
  • sqlcese35.dll
  • System.Data.SqlServerCe.dll
  • System.Data.SqlServerCe.Entity.dll

Я добавил ссылку на System.Data.SqlServerCe в свой проект и убедился, что все перечисленные выше файлы копируются в папку приложения на установочном компьютере.

Вот код, который я использую для настройки EntityConnectionStringBuilder при открытии файла SQL Compact:

var sqlCompactConnectionString = string.Format("Data Source={0}", filePath);

// Set Builder properties
builder.Metadata = string.Format("res://*/{0}.csdl|res://*/{0}.ssdl|res://*/{0}.msl", edmName);
builder.Provider = "System.Data.SqlServerCe.3.5";
builder.ProviderConnectionString = sqlCompactConnectionString;
var edmConnectionString = builder.ToString();

Я пропустил файл?Мне не хватает шага настройки, необходимого для указания Entity Framework, где найти мои библиотеки DLL SQL Compact?Есть ли еще какие-нибудь предложения, почему EF не находит мои библиотеки DLL SQL Compact на установочном компьютере?Спасибо за вашу помощь.

Это было полезно?

Решение

Я понял, как это сделать, благодаря сообщение в блоге Стива Ласкера.По сути, вот что вам нужно сделать:

(1) Установите ссылку на System.Data.SqlServerCe.dll в вашем проекте.Установить CopyLocal свойство True.

(2) В App.config вашего проекта добавьте следующую разметку XML.Он сообщает EntityFramework о необходимости поиска поставщика данных в вашей частной установке SQL Compact:

<system.data>
    <DbProviderFactories>
        <remove invariant="System.Data.SqlServerCe.3.5"/>
        <add name="Microsoft SQL Server Compact Data Provider" invariant="System.Data.SqlServerCe.3.5" description=".NET Framework Data Provider for Microsoft SQL Server Compact" type="System.Data.SqlServerCe.SqlCeProviderFactory, System.Data.SqlServerCe, Version=3.5.1.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91"/>
    </DbProviderFactories>
</system.data>

(3) В проекте установки добавьте следующие файлы в папку приложения в редакторе файловой системы:

  • sqlcecompact35.dll
  • sqlceme35.dll
  • sqlcese35.dll
  • System.Data.SqlServerCe.Entity.dll

Другие советы

Для справки: в SQL CE 4 записи web.config следующие:

  <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.1, Culture=neutral, PublicKeyToken=89845dcd8080cc91" />
    </DbProviderFactories>
  </system.data>

Версия=4.0.0.1 в случае частного развертывания и Version=4.0.0.0 в случае общего развертывания.

спасибо за совет - мне очень помог.Есть сообщение в блоге SQL Server Compact-Team которые добавляют дополнительную информацию для выпуска Sql Server Compact 3.5 SP2.

После некоторых проблем с частным развертыванием sql-сервера Compact я обнаружил некоторые дополнительные требования.

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

Пример:Попробуй это:

-Я установил чистую установку WinXP SP3.

-установлена ​​расширенная версия .net Framework 4.0.

- развернул мое приложение в новой установке (включая все необходимые библиотеки DLL и настройки, описанные в блоге команды компактного сервера вашего/sql-сервера)

Итак, после некоторых исследований я обнаружил, что в дополнение к установке .net framework 4 мне также пришлось установить .net framework 2, и все работало нормально.

Вот мой вопрос:какой компонент используется компактной версией sql-сервера, которая не содержится в .net framework 4?

Я не хочу перегружать свою установку и связывать две платформы с моим загрузчиком...Кто-нибудь знает какой-нибудь хороший совет?

Большое спасибо команде sql server Compact!

SQL Server Compact v3.5 зависит от Visual C++ Runtime 2005 (или 8.0) (также известного как CRT80).Мы упаковываем модули CRT80 в наш MSI.В случае частного развертывания

вам нужно позаботиться об этой зависимости.С .NET FX v2.0 все работает в системе автоматически, поскольку .NET FX v2.0 также упаковывает и устанавливает модули CRT80.

Спасибо

Вот что сработало для меня:

У вас есть файл Machine.config для dotNet версий 2.0 и 4.0:

дотНЕТ 2.0

C:\Windows\Microsoft.NET\Framework\v2.0.50727\CONFIG\machine.config
дотнет 4.0
C:\Windows\Microsoft.NET\Framework\v4.0.30319\Config\machine.config

Если вы откроете файл версии 2.0, вы увидите, что в нем есть узел <system.data>, который, вероятно, выглядит примерно так:

<system.data>
    <DbProviderFactories>
        <add name="Odbc Data Provider" ... stuff here ... />
        <add name="OracleClient Data Provider" ... stuff here ...>
        ... more lines similar to the one above ...
        <add name="Microsoft SQL Server Compact Data Provider" Invariant="System.Data.SqlServerCe.3.5" ...>
    </DbProviderFactories>
</system.data>

Тогда как, если вы откроете версию для dotNet 4.0, она будет выглядеть еще более жалко:

<system.data>
    <DbProviderFactories>        
    </DbProviderFactories>
</system.data>

А может, у него вообще нет узла <system.data>!!!В любом случае просто скопируйте узел <system.data> целиком из файла Machine.config для версии 2 в файл для версии 4.

ПРИМЕЧАНИЕ

Если у вас возникли проблемы с сохранением изменений в файле Machine.config v4, возможно, вам придется несколько раз щелкнуть правой кнопкой мыши по значку запуска редактора, чтобы перейти к запуску в режиме администратора.

Застрял с той же проблемой,

«указанный поставщик хранилища не найден в конфигурации или недействителен».

Я наткнулся на этот пост.Я попробовал почти все.Я установил "System.Data.SqlServerCe"с помощью nugets.

Итак, я уже добавил строку кода ниже в свой web.config.

<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" />
  <!--<add name="MySQL Data Provider" invariant="MySql.Data.MySqlClient" description=".Net Framework Data Provider for MySQL" type="MySql.Data.MySqlClient.MySqlClientFactory, MySql.Data, Culture=neutral, PublicKeyToken=c5687fc88969c44d" />-->
  <!--<add name="Microsoft EntityClient" invariant="System.Data.EntityClient.4.0" description=".NET Framework Data Provider for Microsoft SQL Server Compact" type="System.Data.SqlServerCe.EntityClient, System.Data.EntityClient, Version=4.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91" />-->
</DbProviderFactories>

Все равно ошибка продолжалась..

Я избавился от проблемы, раскомментировав две последние строки с комментариями в приведенном выше коде... так что теперь это становится

<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" />
  <add name="MySQL Data Provider" invariant="MySql.Data.MySqlClient" description=".Net Framework Data Provider for MySQL" type="MySql.Data.MySqlClient.MySqlClientFactory, MySql.Data, Culture=neutral, PublicKeyToken=c5687fc88969c44d" />
  <add name="Microsoft EntityClient" invariant="System.Data.EntityClient.4.0" description=".NET Framework Data Provider for Microsoft SQL Server Compact" type="System.Data.SqlServerCe.EntityClient, System.Data.EntityClient, Version=4.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91" />
</DbProviderFactories>

Надеюсь, поможет..Спасибо.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top