4

このT4 テンプレートを使用して EF4 Code First 用に事前に生成されたビューは、ビルド サーバーでは機能しません。ビルド サーバーでビューを再生成するのではなく、MSTest をコンパイルして実行するだけです。テストの実行時にエラーがスローされます。

System.Data.MappingException: EntityContainer 'DB' のマッピングおよびメタデータ情報が、事前生成されたビューの作成に使用された情報と一致しなくなりました

別のマシンで同じテンプレートを実行しましたが、ハッシュ値が異なります。これがビルドサーバーで機能しない理由だと思います。他のマシンでは実行時にハッシュ値が異なるため、検証が失敗し、例外がスローされます。

私は使用しています:

  • VS 2010 プロ
  • .Net フレームワーク v4.0.30319
  • エンティティ フレームワーク v4.2 (コード ファースト)
  • EF CodeFirst View Generation T4 Template for C# (v1.0.1) - GetEdmxSchemaVersion をわずかに変更して、セットアップの正しい EntityFrameworkVersions バージョンを返します。
  • クラス ライブラリ プロジェクト テンプレートの使用

私が実行しているテストは、コードでチェックインされている SQL DB ファイルに接続します。

ビルド サーバーと、同じ EF dll バージョンと .Net Framework バージョンを使用していることを確認しました。

ハッシュ値が異なる理由は何ですか?

更新: EdmxWriter.WriteEdmx() を使用して、2 つの開発マシンから 2 つの XML ファイルを生成して比較しました。

スキーマのバージョンは次のとおりです (両方のマシンで同じ)。

<?xml version="1.0" encoding="utf-8"?>
<Edmx Version="2.0" xmlns="http://schemas.microsoft.com/ado/2008/10/edmx">

明らかな違いは、XML ファイル内のいくつかのノードの順序です。次に例を示します。

マシン 1:

<EntityType Name="PersonEntity" BaseType="Self.Entity" />
<EntityType Name="CompanyEntity" BaseType="Self.Entity" />

マシン 2:

<EntityType Name="CompanyEntity" BaseType="Self.Entity" />
<EntityType Name="PersonEntity" BaseType="Self.Entity" />

なぜそれらが異なる順序になっているのか分かりますか?

更新 2: ビルド サーバーからの Edmx (xml) は、他の 2 つの開発マシンでも異なります。ここでも、一部のノードの順序が異なります。

マシン 1 とビルド サーバーの両方に System.Data.Entity.dll (同じファイルと製品バージョン -- v4.0.30319.1 ) が %windir%\Microsoft.NET\assembly\GAC_MSIL\System.Data.Entity\v4.0_4 にあります。 .0.0.0__b77a5c561934e089.

更新 3: System.Data.Entity.Design.dll のバージョンも確認しました。T4 テンプレートは、このアセンブリを参照します。マシン 1 には、この dll の 2 つのコピーがあります... GAC (v4.0.30319.233) と C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework.NETFramework\v4.0 (v4.0.30319.1) にあります。 . これは、ビルド サーバーとマシン 2 にも当てはまります。ランタイム中のハッシュ検証関数が、プロジェクトで参照されていないため、この dll を使用しているのだろうかと思います。使用されている場合は、どのバージョンが使用されているか。しかし、再び、マシン 1 でハッシュ検証が成功します。

4

1 に答える 1

1

私は自分の質問に答えています。主な問題 (さまざまなマシンで使用できる EF Code First でビューを事前に生成する方法) を解決する方法は次のとおりです。現在、.Net ランタイム 4.0.30319.17929 を使用しています。

  1. MyContext.cs がある ABC.csproject で、T4 テンプレートと MyContext.Views.cs を削除します。

  2. ABC.csproject をコンパイルする

  3. ビューを生成するコンソール アプリを作成します。Pawel の T4 テンプレートのほとんどをコピーしました。ABC.dll (およびその他の必要な dll) を参照します。変更点の 1 つを次に示します。

    var edmx = GetEdmx(typeof(MyContext));

  4. GenerateViews() の文字列出力をテキスト ファイルに保存します。

  5. コンソール アプリを実行します。

  6. MyContext.Views.cs という名前の新しいファイルを ABC.csproject に追加し、テキスト ファイルの内容をこのクラスにコピーします。
  7. ABC.csproject を再コンパイルします。

私は自分のソリューションが正気ではなく、単純化または自動化する必要があると感じていますが、うまくいきます。

于 2013-01-15T06:26:27.517 に答える