ページング(つまり、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にフォールバックページネーションアプローチを使用する方法ですか。
私はこの問題を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()
);
Edmxファイルを使用する場合は、XMLエディターを使用してedmxファイルを開き、
ProviderManifestToken="2012" ==> ProviderManifestToken="2008"
7行目。
詳細については、このブログ投稿をご覧ください。 http://erikej.blogspot.com.tr/2014/12/a-breaking-change-in-entity-framework.html
RC 1で壊れています。RC2を入手するまでお待ちください。
MyDbConnectionStringは、任意のソースからの接続文字列です
_protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseSqlServer(_config["MyDbConnectionString"],
options=>
{
options.UseRowNumberForPaging();
});
}
_
UseRowNumberForPaging()
edmxファイルシナリオを除くすべてのケースで問題を解決しました。
ここでは、ConfigureServices
にUseRowNumberForPaging()
を設定するだけです
services.AddDbContext<CallcContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("Connectionstring"),opt=> { opt.UseRowNumberForPaging(); }));
あなたはこのようなものを使う必要があります:
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);