1

これは控えめに言っても私を少しイライラさせました...

サービスレイヤープロジェクトをv.nextにアップグレードしており、その過程ですべてのLinqtoSqlモデルをEntityFrameworkに「アップグレード」しています。これまでに4つのデータベースを作成し、現在テストを実行しています-テストはエラーで失敗します

System.Data.MetadataException:指定されたスキーマが無効です。エラー:DB.WebDB.ssdl(2,84):エラー0169:すべてのSSDLアーティファクトは同じプロバイダーをターゲットにする必要があります。ProviderManifestToken '2008'は、以前に検出された'2005'とは異なります。

グーグルを実行すると、これは多くの場合、異なるdev /livesqlサーバーのバージョンが原因であることがわかります。

私のシナリオは異なりますが、異なるバージョン(2005、2008、および2008 R2)を実行している複数のライブデータベースサーバーがあり、異なるEDMXを使用してそれらすべてと通信できる必要があります。

このSO:単一のASP.NETアプリケーションでEntityFrameworkを使用するSQLServerの複数のバージョンでは、1つの解決策は、異なるバージョンのEDMXを異なるアセンブリ(つまり、2005および2008バージョン)に分割することであるように思われます。おそらく別の解決策はProviderManifestToken、2008年にソースされたデータベースのmyを強制すること2005です。

しかし、私にとって、1つのEDMXが他のすべてを壊す可能性のあるEFの動作の癖を満たすためだけに、異なるアセンブリを作成する必要があるという考えはばかげています-私にとって、個別のアセンブリはアーキテクチャ上の決定です。同様に、EDMXファイルをハッキングして2008データベースをダウングレードすることも望ましくありません。特に、次の「データベースから更新...」コマンドでファイルを元に戻す場合はなおさらです。

誰かが別の解決策を手に入れましたか?

4

1 に答える 1

4

EDMXとdesignerを使用する場合、代替ソリューションはありません。EDMXは単一データベースの実装に固定されています。SQL Serverの場合、SQL Server 2005と2008の方言が異なるため、さらに悪化します(2012年が来ると予想されます)。EDMXを使用すると、データベース実装とのこの緊密な結合はSSDL(EDMXでのデータベース記述)の一部になります。VSのデフォルトのEFデザイナも使用している場合、SSDLを完全に制御することはできません。データベースからモデルを更新するとき、またはモデルからデータベースを生成するときに、SSDLは常に再作成されます。

現在のソリューションは次のとおりです。

  • 開発でSQLServer2005を使用すると、VSDesignerはプロバイダーマニフェストを上書きしません。この構成は、SQLServer2008および2008R2でも機能するはずです。
  • 実行時に自動的に処理されるEDMXの代わりに、最初にコード(EF 4.1-4.3.1)を使用します
  • VSデザイナーを使用せず、EDMXを手動で保守するか、より強力なデザイナーを購入してください
  • SQL Serve 2005および2008用に個別のSSDLパーツを作成し、使用されているデータベースの実装に従って、接続文字列でそれらを正しく参照します。これには、2つのほぼ同じSSDLドキュメントを維持するなど、多くの欠点があります。また、VSデザイナを使用することはできません。
于 2012-05-14T08:54:15.937 に答える