web-dev-qa-db-ja.com

Entity Framework 7とSQL Server 2008によるページング

ページング(つまり、Entity Framework 7の.Skip(...).Take(...))を使用しようとしています。MicrosoftSQL Server 2012および2014では問題なく動作しますが、SQL Server 2008では次のエラーで失敗します。

System.Data.SqlClient.SqlException(0x80131904):「OFFSET」付近の構文が正しくありません。 FETCHステートメントでのオプションNEXTの無効な使用。

私はそれがEFバージョン6.1.2の重大な変更であることを理解しました( http://erikej.blogspot.com/2014/12/a-breaking-change-in-entity-framework.html )。ただし、修正はEDMXファイル設定のProviderManifestToken属性を「2008」に変更することです。

問題は、EF7が現在コードファーストのシナリオのみをサポートしているため、そこにEDMXがないことです。問題は、ASP.NET 5 WebサイトをEntity Framework 7で構成して、2012年より前のSQL Serverにフォールバックページネーションアプローチを使用する方法ですか。

21
Konstantin

私はこの問題をEF 7とSQL Server 2008を使用して自分で発生しました。幸い、EF 7の最新のrc1バージョンでは、この例に示すように.UseRowNumberForPaging()を使用してこれを解決できます。

services.AddEntityFramework()
  .AddSqlServer()
  .AddDbContext<YourDbContext>(options =>
     options.UseSqlServer(configuration["Data:DefaultConnection:ConnectionString"])
                    // this is needed unless you are on mssql 2012 or higher
                    .UseRowNumberForPaging()
                );
14
Joe Audette

Edmxファイルを使用する場合は、XMLエディターを使用してedmxファイルを開き、

ProviderManifestToken="2012" ==> ProviderManifestToken="2008"

7行目。

詳細については、このブログ投稿をご覧ください。 http://erikej.blogspot.com.tr/2014/12/a-breaking-change-in-entity-framework.html

38
mesut

RC 1で壊れています。RC2を入手するまでお待ちください。

https://github.com/aspnet/EntityFramework/issues/4616

4
Simon Ordo

MyDbConnectionStringは、任意のソースからの接続文字列です

_protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
    optionsBuilder.UseSqlServer(_config["MyDbConnectionString"], 
                options=>
                {
                    options.UseRowNumberForPaging();
                });
}
_

UseRowNumberForPaging() edmxファイルシナリオを除くすべてのケースで問題を解決しました。

2
Salman Taj

ここでは、ConfigureServicesUseRowNumberForPaging()を設定するだけです

services.AddDbContext<CallcContext>(options => 
options.UseSqlServer(Configuration.GetConnectionString("Connectionstring"),opt=> { opt.UseRowNumberForPaging(); }));
0
Ali

あなたはこのようなものを使う必要があります:

var MinPageRank = (pageIndex - 1) * pageSize + 1;
var MaxPageRank = (pageIndex * pageSize);

var person = _context.Person.FromSql($"SELECT * FROM (SELECT [RANK] = ROW_NUMBER() OVER (ORDER BY Surname),* FROM Person) A WHERE A.[RANK] BETWEEN {MinPageRank} AND {MaxPageRank}").ToList();

IQueryable<Person> PersonIQ = from s in person.AsQueryable() select s;
Person = await PaginatedList<Person>.CreateAsync(PersonIQ .AsNoTracking(), pageIndex ?? 1, pageSize, sourceFull);
0
Belen Martin