Использование Entity Framework с частной установкой SQL Compact - PullRequest
20 голосов
/ 29 марта 2010

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

На моей машине разработки SQL Compact 3.5 с пакетом обновления 1 (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, где найти мои библиотеки SQL Compact DLL? Любые другие предложения, почему EF не находит мои библиотеки SQL Compact DLL на установочном компьютере? Спасибо за вашу помощь.

Ответы [ 5 ]

37 голосов
/ 30 марта 2010

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

(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
22 голосов
/ 17 февраля 2011

Только для записи, в 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 в случае частного развертывания и Версия = 4.0.0.0 в случае общего развертывания.

2 голосов
/ 24 июня 2010

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

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

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

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

- Я установил чистую установку winxp sp3

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

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

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

Итак, вот мой вопрос: какой компонент используется компактной версией SQL Server, который не содержится в .net framework 4?

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

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

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

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

Спасибо

1 голос
/ 10 ноября 2011

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

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

dotNET 2.0

C:\Windows\Microsoft.NET\Framework\v2.0.50727\CONFIG\machine.config
dotNet 4.0
C:\Windows\Microsoft.NET\Framework\v4.0.30319\Config\machine.config

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

<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>

Или, можетдаже нетузел вообще !!!В любом случае просто скопируйтев целом узел из файла machine.config для v2 в файл для v4.

SIDE NOTE

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

0 голосов
/ 04 сентября 2013

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

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

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

Так что у меня уже была строка кода ниже, добавленная в мой 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>

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

...