web-dev-qa-db-ja.com

SQLCompactプライベートインストールでのEntityFrameworkの使用

SQLCompactを使用するデスクトップアプリケーションでEntityFramework4を使用しています。アプリケーションでSQLCompactのプライベートインストールを使用したいので、インストーラーはユーザーに2回目のインストールを行わなくてもSQLCompactをインストールできます。また、バージョン管理の煩わしさを回避できます。

私の開発マシンには、パブリックインストールとしてSQL Compact 3.5 SP1がインストールされているため、予想どおり、アプリは正常に実行されます。しかし、SQLCompactがインストールされていないテストマシンでは実行されていません。このエラーが発生します:

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

SQL Compactのプライベートインストールに問題を抱えている人がいることは知っていますが、 しばらく使用しています 、本当に気に入っています。残念ながら、私の通常のプライベートインストールアプローチは機能していません。 SQL CEファイルのバージョン番号を確認しましたが、すべて3.8.8078.0であり、これはSP2RCバージョンです。

プライベートインストールに含めたファイルは次のとおりです。

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

System.Data.SqlServerCeへの参照をプロジェクトに追加し、上記のすべてのファイルがインストールマシンのアプリケーションフォルダーにコピーされていることを確認しました。

SQLCompactファイルを開くときにEntityConnectionStringBuilderを構成するために使用するコードは次のとおりです。

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();

ファイルがありませんか? SQL Compact DLLの場所をEntityFrameworkに指示するために必要な構成手順がありませんか? EFがインストールマシンでSQLCompact DLLを見つけられない理由の他の提案はありますか?ご協力いただきありがとうございます。

20
David Veeneman

Steve Laskerによるブログ投稿 のおかげで、私はそれを行う方法を理解しました。基本的に、これがあなたがしなければならないことです:

(1)プロジェクトでSystem.Data.SqlServerCe.dllへの参照を設定します。 CopyLocalプロパティをTrueに設定します。

(2)プロジェクトのApp.configで、次のXMLマークアップを追加します。 EntityFrameworkに、SQLCompactのプライベートインストールでデータプロバイダーを探すように指示します。

<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
37
David Veeneman

念のため、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.一般展開の場合。

22
Jonx

あなたのヒントに感謝します-私を大いに助けました。 SQL Server Compact-Teamブログへの投稿 があり、SQL Server Compact 3.5SP2リリースの追加情報が追加されています。

SQL Server Compactのプライベート展開にしばらく苦労した後、私はいくつかの追加要件を見つけました。

いくつかの異なるシステムでアプリを試してみましたが、一部のシステムではアプリが正しく機能しないことがわかりました。

例:これを試してください:

-私はクリーンなwinxpsp3インストールをセットアップしました

-.net Framework4.0拡張をインストールしました

-アプリを新しいインストールにデプロイしました(/ sqlサーバーコンパクトチームのブログ投稿に記載されている必要なすべてのdllと微調整を含む)

そのため、調査の結果、.net Framework 4のインストールに加えて、.net Framework 2もインストールする必要があり、正常に機能することがわかりました。

だからここに私の質問があります:.netフレームワーク4に含まれていないSQL Server Compact Editionで使用されているコンポーネントはどれですか?

セットアップをオーバーロードして、2つのフレームワークをブートストラップにチェーンしたくない...誰かが良いヒントを知っていますか?

SQL Server Compact Teamに感謝します!

SQL Server Compact v3.5は、「Visual C++ Runtime 2005(または8.0)」(CRT80とも呼ばれます)に依存しています。 CRT80モジュールをMSIにパッケージ化します。プライベート展開の場合、

この依存関係に注意する必要があります。 .NET FX v2.0はCRT80モジュールもパッケージ化してインストールするため、システム上の.NET FXv2.0で自動的に機能します。

ありがとう

2
Renato Heeb

これは私のために働いたものです:

DotNetバージョン2.0および4.0用のmachine.configファイルがあります。

dotNET 2.0

C:\ Windows\Microsoft.NET\Framework\v2.0.50727\CONFIG\machine.config
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>ノード全体をv2のmachine.configファイルからv4のファイルにコピーするだけです。

サイドノート

V4 machine.configの編集を保存するのに問題がある場合は、管理者モードで実行するために、エディターの起動アイコンをクリックするときに数回右クリックする必要がある場合があります。

1

同じ問題で立ち往生している、

「指定されたストアプロバイダーが構成に見つからないか、無効です。」

私はこの投稿に出くわしました。私はほとんどすべてを試しました。 nugetsを使用して "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>

それでもエラーは続きました。

上記のコードの最後の2行のコメントを外すことで問題を取り除きました...

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

お役に立てば幸いです。ありがとうございます。

0
Neelam