5

(これは以前は2部構成の質問でしたが、2番目の部分は文字通り重要なものなので、これを2つの別々の投稿に分割することにしました。2番目の部分については、シリアル化を使用してEntityFrameworkの2つのObjectContext間でエンティティをコピーするを参照してください。

エンティティモデル用のデータベースのかなり一般的な「クローナー」を作成したいと思います。また、さまざまなプロバイダーなどをサポートする必要があるかもしれません。ObjectContextAPIを使用しています。

私はすでにこの質問EntityConnectionStringBuilderMDSNドキュメントの例を知っていますが、 ?のプロパティを初期Provider化するための値を取得するプログラム的な方法があるかどうかを知る必要があります。MetadataEntityConnectionStringBuilder

using (var sourceContext = new EntityContext()) {
    var sourceConnection = (EntityConnection) sourceContext.Connection;
    var targetConnectionBuilder = new EntityConnectionStringBuilder();

    targetConnectionBuilder.ProviderConnectionString = GetTargetConnectionString();
    targetConnectionBuilder.Provider = "System.Data.SqlClient"; // want code
    targetConnectionBuilder.Metadata = "res://*/EntityModel.csdl|res://*/EntityModel.ssdl|res://*/EntityModel.msl"; // want code

    using (var targetContext = new EntityContext(targetConnectionBuilder.ConnectionString)) {
        if (!targetContext.DatabaseExists())
            targetContext.CreateDatabase();

        // how to copy all data from the source DB to the target DB???
    }
}

つまり、をフェッチする方法はありますか

  • "System.Data.SqlClient"
  • "res://*/EntityModel.csdl|res://*/EntityModel.ssdl|res://*/EntityModel.msl"

どこかから、リテラル値を使用しませんか?

4

1 に答える 1

1

メタデータ

を使用res://*/して、呼び出し元のアセンブリ内のすべての.csdl、.ssdl、および.mslファイルを検索するようにEntityFrameworkに指示できるはずです。または、を使用res://assembly full name here/して特定のアセンブリを検索します。これらの構文は両方とも、見つかったすべてのファイルをロードすることに注意してください。これは、同じアセンブリに複数の.edmxが含まれるまで正常に機能し、結果として複数のCSDL / SSDL / MSLファイルになります(.edmxファイルは基本的にこれら3つのファイルの連結です)。MSDNの詳細情報。

より詳細な制御が必要な場合は、Assembly.GetManifestResourceNamesを使用して、特定のアセンブリ内のすべてのリソースを一覧表示し、.csdl / .ssdl / .mslリソースを手動で照合してから、それらのリソース名からメタデータ文字列を手動で作成します。

プロバイダー

プロバイダーは、ルートノードのプロバイダー属性のSSDLファイルにあります。正しいファイル名を取得したら、GetManifestResourceStreamそのファイルをXMLとして使用して読み取ります。コードは次のようになります。

using (var stream = assembly.GetManifestResourceStream("EntityModel.ssdl")) {
  XDocument document = XDocument.Load(stream);
  string provider = document.Root.Attribute("Provider").Value;
}
于 2012-09-26T15:32:20.507 に答える