5

かなり大きなプロジェクトのスクリプトを作成中です。プロジェクトの 1 つは、エンティティ フレームワーク モデルをライブラリにコンパイルする必要があります。ビルド サーバーの動作方法により、開発者やプロジェクト ファイルに影響を与えることなく、さまざまな展開シナリオを管理するために、すべてのビルドが手作業で作成されます。

Visual Studio によって生成されたプロジェクト ファイルを使用せずに、MSBuild タスクを使用して EF モデルを生成する方法はありますか? 現在、実際のアセンブリは CSC タスクを使用してコンパイルされますが、コンパイルされたアセンブリに EF モデルが含まれていないため、実際に展開されたアプリケーションは失敗します。

モデルを生成し、アセンブリに埋め込むために必要なリソースを作成するためにターゲットまたはビルド タスクを使用できるポインターはありますか?

ご注意ください

プロジェクトは Visual Studio で正常にコンパイルされますが、展開時にプロジェクトにさまざまな変更を加える必要があるため、ビルド サーバーでプロジェクト ファイルを使用することはできません。これは、外部のカスタム ビルド スクリプトによって制御されます。開発チームが管理します。これはいくつかのプロジェクトでうまく機能していますが、この特定のシナリオでは EF モデルが頭痛の種になっています。

アップデート

現在のソリューションは理想的ではありませんが、機能します。プロジェクト ファイルは、EF モデル リソースを新しいリリース ビルドのプロジェクト内のフォルダーにコピーするように変更されており、ソース管理にチェックインされます。ビルド スクリプトがサーバー上で実行されると、EF モデルがアセンブリに埋め込まれます。これは、現時点で実行可能な回避策のようです。

4

2 に答える 2

4

プロジェクトのソース ツリーが、リソースを生成して出力 dll に埋め込む Entity Framework のビルド タスクを実行するように適切に設定されていないため、今日は実際にこれに対処しました。

次のオプションを調査しました。

EntityDeploy msbuild タスクの使用

.csproj ファイルをメモ帳で開くと、次のような XML が表示されます。

 <EntityDeploy Include="MyEntities.edmx">
  <Generator>EntityModelCodeGenerator</Generator>
  <LastGenOutput>MyEntities.Designer.cs</LastGenOutput>
 </EntityDeploy>

これは、Microsoft.Data.Entities.Build.targetsMicrosoft.Data.Entities.Build.dllを使用して edmx ファイルを読み取り、ssdl、csdl、および msl ファイルを生成してから、それらをターゲット dll に埋め込む msbuild タスクです。(これらのファイルはC:\Windows\Microsoft.NET\Framework\v3.5 にあります)。

EdmGen の使用

Craig が指摘したように、フレームワークに同梱されているEdmGen.exeを使用できる可能性があります。私はそれを試してみましたが、edmx ファイルのデータを少しカスタマイズしており、EdmGen.exe は元のデータベースから最初の生成を行いたいようです。

EdmGen2 の使用

EdmGen2.exeは、EdmGen よりも少し多くのことを行うオープン ソース プロジェクトです。私はそれを使用してssdl、csdl、およびmslファイルを生成しました。edmx ファイルを指定するだけで、必要な ssdl、csdl、および msl ファイルが生成されます。次に、これらをdllと一緒に含め、接続文字列をから変更しました

connectionString="metadata=res://*/MyEntities.csdl|res://*/MyEntities.ssdl|res://*/MyEntities.msl;

connectionString="metadata=./MyEntities.csdl|./MyEntities.ssdl|./MyEntities.msl;

これらのファイルがリソースとして埋め込まれているのではなく、dll と同じディレクトリにあることをエンティティ フレームワークに伝えていることに注意してください。

これら 3 つ、ビルド タスク、EdmGen、および EdmGen2 はすべて、すべてのハード タスクに対して System.Data.Entity.dll を呼び出すシン ラッパーです。最後の手段として、リフレクターのビルド タスク dll を覗いて、それが何をしているかを確認することができます。

お役に立てれば。

于 2010-02-03T07:37:28.020 に答える
1

はい、これを実行できると呼ばれるコマンドラインユーティリティEdmGenがあります。EdmGen /?可能なスイッチに使用します。

于 2010-02-01T14:01:21.443 に答える