web-dev-qa-db-fra.com

Pagination avec Entity Framework 7 et SQL Server 2008

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?

21
Konstantin

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()
                );
14
Joe Audette

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

36
mesut

C'est cassé en RC 1. Il faut attendre pour avoir le RC 2.

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

4
Simon Ordo

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.

2
Salman Taj

Ici, il suffit de mettre UseRowNumberForPaging() dans ConfigureServices

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

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);
0
Belen Martin