構成を変更するだけで、SQL Server と SQL Server Compact Edition の間でデータ プロバイダーを切り替えることができるようになることを望んでいました。しかし、それは機能せず、EDMX ファイルを見ると、理由がわかると思います。
<edmx:StorageModels>
<Schema ... Provider="System.Data.SqlClient" ...
app.config または実行時にプロバイダーを指定する方法はありますか?
構成を変更するだけで、SQL Server と SQL Server Compact Edition の間でデータ プロバイダーを切り替えることができるようになることを望んでいました。しかし、それは機能せず、EDMX ファイルを見ると、理由がわかると思います。
<edmx:StorageModels>
<Schema ... Provider="System.Data.SqlClient" ...
app.config または実行時にプロバイダーを指定する方法はありますか?
Storage-Model は特定のプロバイダーに関連付けられているため、Entity Framework は、指定されたプロバイダーと互換性のない DbConnection 実装を拒否します。
Entity Framework 接続文字列を見ると、StorageSchema、ModelSchema、および Mapping が 3 つの異なるファイル (.edmx から生成され、アセンブリに埋め込まれている) で指定されていることがわかります。.edmx を分解して、.ssdl、.csdl、および .msl を自分で埋め込み、SQL Server CE 用に別の .ssdl を作成することができます。これは基本的に、プロバイダーといくつかの列タイプをコピーして貼り付けて置き換えるだけです。
私はここについて書きました:比較エンティティ フレームワーク
単体テストでは、この方法でスキーマを変更します (メイン コードの実行前に ssdl を変更します)。
コード内:
var s = Assembly.GetExecutingAssembly().GetManifestResourceStream("Model1.ssdl");
var ssdlFilePath = "<some-dir>\file1.ssdl";
using (var file = File.Create(ssdlFilePath))
{
StreamUtil.Copy(s, file);
}
var str = File.ReadAllText(ssdlFilePath);
str = str.Replace("old provider token", "ProviderManifestToken=\"4.0\"");
str = str.Replace("old provider type"", "Provider=\"System.Data.SqlServerCe.4.0\"");
File.WriteAllText(ssdlFilePath, str);
app.config で:
<connectionStrings>
<add name="Database2Entities" connectionString="metadata=res://*/Model1.csdl|<some-dir>\file1.ssdl|res://*/Model1.msl;provider=System.Data.SqlServerCe.4.0;provider connection string="Data Source=|DataDirectory|\Database1.sdf"" providerName="System.Data.EntityClient" />
</connectionStrings>
できます)