J'essaie d'utiliser la pagination (c'est-à-dire .Skip(...).Take(...)
dans Entity Framework 7. Cela fonctionne correctement avec Microsoft SQL Server 2012 et 2014, mais échoue avec l'erreur suivante sur SQL Server 2008:
System.Data.SqlClient.SqlException (0x80131904): Syntaxe incorrecte près de 'OFFSET'. Utilisation non valide de l'option NEXT dans l'instruction FETCH.
J'ai compris qu'il s'agissait d'un changement radical dans la version 6.1.2 d'EF ( http://erikej.blogspot.com/2014/12/a-breaking-change-in-entity-framework.html ) . Mais le correctif consiste à modifier l'attribut ProviderManifestToken du fichier EDMX en "2008".
Le problème est que EF7 ne prend actuellement en charge que le scénario code-premier, il n’existe donc pas d’EDMX. La question qui se pose est la suivante: comment configurer le site Web ASP.NET 5 avec Entity Framework 7 pour utiliser la méthode de pagination de secours pour SQL Server antérieure à 2012?
J'ai moi-même rencontré ce problème avec EF 7 et SQL Server 2008. Heureusement, dans la dernière version rc1 de EF 7, vous pouvez résoudre ce problème en utilisant .UseRowNumberForPaging (), comme indiqué dans cet exemple:
services.AddEntityFramework()
.AddSqlServer()
.AddDbContext<YourDbContext>(options =>
options.UseSqlServer(configuration["Data:DefaultConnection:ConnectionString"])
// this is needed unless you are on mssql 2012 or higher
.UseRowNumberForPaging()
);
Si vous utilisez un fichier Edmx, vous devez l’ouvrir à l’aide de XML Editor et le modifier.
ProviderManifestToken="2012" ==> ProviderManifestToken="2008"
dans la ligne 7.
Veuillez consulter cet article de blog pour plus d'informations: http://erikej.blogspot.com.tr/2014/12/a-breaking-change-in-entity-framework.html
C'est cassé en RC 1. Il faut attendre pour avoir le RC 2.
MyDbConnectionString est une chaîne de connexion de n'importe quelle source
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseSqlServer(_config["MyDbConnectionString"],
options=>
{
options.UseRowNumberForPaging();
});
}
UseRowNumberForPaging()
résolu le problème dans tous les cas, sauf pour le scénario de fichier edmx.
Ici, il suffit de mettre UseRowNumberForPaging()
dans ConfigureServices
services.AddDbContext<CallcContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("Connectionstring"),opt=> { opt.UseRowNumberForPaging(); }));
Vous devez utiliser quelque chose comme ceci:
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);