2

私は、Entity Frameworkバージョン6を使用するASP.NET MVC 5 Webアプリケーションを作成しています。「OFFSETの近くで構文が正しくない」を回避する方法FETCH文でNEXTオプションの無効な使用方法。

開発サーバー内のSQL Server 2012でアプリケーションを開発しました。データベーステーブルをマップして、.edmxモデルファイルを生成しました。私の開発サーバーではすべてがうまくいきます。 「オフセット」の近くに

不正な構文 - :私はSQL Server 2008を使用して私たちのライブサーバー上でアプリケーションを展開したとき

は今、私は次の例外を得ました。 FETCHステートメントでNEXTオプションの使用法が無効です。私のアクションメソッド内の次のコードで

: -

records.Content = await db.SalesDatas.Where(x=> 
       (String.IsNullOrEmpty(currentdomainfilter) || x.EmailDomain.ToLower().Contains(currentdomainfilter.ToLower().Trim())) 
       && 
       (String.IsNullOrEmpty(currentgatewayfilter) || x.EmailGateway.ToLower().Contains(currentgatewayfilter.ToLower().Trim())) 
       ).OrderBy(sort + " " + sortdir) 
        .Skip((page - 1) * pageSize.Value) 
        .Take(pageSize.Value).ToListAsync(); 

私は、問題を記述し、それhttp://erikej.blogspot.ro/2014/12/a-breaking-change-in-entity-framework.htmlを修正する方法は、このリンクを見つけます。

ので、私は私のASP.NET MVCプロジェクト内で次のようでした:

  1. 私は.edmxファイルを編集します。
  2. 私は今、私のアプリケーションが私の質問は、私が適用修正が正しい方法であるかどうかであるSQL Server 2012のとSQL Server 2008の

    にうまく機能している2012年から2008年

ProviderManifestTokenの値を変更それは回避策です。つまり、基本となるSQL Serverのバージョンが2012の場合は、.edmxOFFSET..FETCHを適用し、SQL Serverのバージョンが2008の場合はこれを避ける方法がありますか?この問題を解決するために私が従ったアプローチ(ProviderManifestTokenの値を2012から2008に変更)では、SQL Server 2012の新機能(例:OFFSET..FETCH)を削除し、利用可能な機能のみを使用しています

+1

現在のところ、この問題を解決する唯一の方法は、EFでサポートする必要があるアプリケーションの最低SQL Serverバージョンに 'ProviderManifestToken'を設定する必要があります。 –

+0

IMO通常のページングに頼るのではなく、キーベースのページングに切り替える必要があります。あなたのページの終わりがキー 'X'で、ページに' Y'行があるとしたら、次のページは 'SELECT TOP Y ... FROM

WHERE key> X'です。どのようにASP.NETに変換するかわからない、私はこの質問のSQL Serverの角度に話すことができます。 –

+1

'.edmx'ファイルはコンパイル時にビルドされるため、実行時にこの動作を変更することはできません。 **複数のSQL Serverバージョンをサポートしたい場合は、サポートするSQL Serverバージョンごとに1つのリリースパッケージを作成する必要があります。これには、各コンパイルの前に適切なバージョンに 'ProviderManifestToken'を更新し、正しいバージョンをクライアント/サーバに配備する必要があります。また、複数のコードブランチ、SQLサーバーバージョン(*はPITA IMO *)ごとに1つずつこれを処理できます。 – Igor

答えて

3

.edmxファイルの内容はコンパイル時に作成されるため、実行時にこの動作を変更することはできません。

これは、2つの選択肢があることを意味します。

  1. コメント内に既に@marc_sが指摘しているように、使用したいと思う最も低いバージョンのSql Serverを指します。これはあなたがすでに使用している解決策であり、これは回避策ではなく、この仕組みです。
  2. アプリケーションで複数のSql Serverバージョンをサポートする場合は、サポートするSql Serverバージョンごとに1つのリリースパッケージを作成する必要があります。リリースパッケージは、.edmxファイルが別個のプロジェクトに含まれている場合はdll、または1つのMVCプロジェクトを持っている場合はアプリケーション全体に置き換えることができます。これには、各コンパイルの前に適切なバージョンにProviderManifestTokenを更新し、正しいバージョンをクライアント/サーバーに展開する必要があります。
+0

主に私は2012年にはedmxの2つのバージョンを持っている必要がありますが、もう1つは2008年ですか? –

+1

@johnG - 変更をどのように管理するかによって異なります。コンパイル時に値を変更するためにビルドスクリプトを使用することができます(*これを行う必要があればこれは私の選択です)。また、2つの.edmxファイルを同期させておくこともできますが、これにはメンテナンスやコードの使い方など、さまざまな問題があります。 – Igor

+1

@johnG - 私は別のプロジェクトに.edmxを保存し、2つのバージョンをビルドスクリプトを使ってコンパイルします*。展開の一部として、環境に基づいて正しい.DLLを展開することができます。 – Igor

関連する問題