添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
相关文章推荐
果断的移动电源  ·  model.config.id2label ...·  4 月前    · 
多情的啄木鸟  ·  根据SVG ...·  1 年前    · 
一身肌肉的包子  ·  C# ...·  1 年前    · 
曾经爱过的冰棍  ·  javascript - How to ...·  1 年前    · 

用Entity Framework 7和SQL Server 2008进行分页

24 人关注

我正在尝试使用分页(即 .Skip(...).Take(...) 在Entity Framework 7中。它在Microsoft SQL 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出来。问题是:如何配置带有Entity Framework 7的ASP.NET 5网站,以便对2012年以前的SQL Server使用回退分页方法?

1 个评论
请参阅问题 #1326 ,并添加你可能有的任何评论。
asp.net-mvc
sql-server-2008
paging
entity-framework-core
Konstantin
Konstantin
发布于 2015-05-02
7 个回答
mesut
mesut
发布于 2018-11-13
0 人赞同

如果你使用Edmx文件,你必须用XML编辑器打开edmx文件,并改变

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

在第7行。

请看这篇博文以了解更多信息。 http://erikej.blogspot.com.tr/2014/12/a-breaking-change-in-entity-framework.html

谢谢。当我的Azure数据库在本地数据库中使用时,同样的问题得到解决。
Khan
这为我节省了很多时间,这值得更多的关注。 在我的案例中,我的开发环境是SQL SERVER 2012,我的QA环境是2008 R2。
如果改成了2008,还能和SQL Server 2012一起工作吗?
已确认。它也适用于SQL Server 2012。现在,我相信这个答案是来自天堂的!
现在是2019年,这个修复方法仍然完美地工作。 现在我希望有人能从2008年开始更新我们的数据库...。来吧,DBA们,你们可以做到的。)
Joe Audette
Joe Audette
发布于 2018-11-13
已采纳
0 人赞同

我自己在使用EF 7和sql server 2008时遇到了这个问题。幸运的是,在EF7的最新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()
    
我这样做了,但我还是遇到了上述错误。
在RC1中不工作。 Linq "跳过 "仍然试图生成OFFSET/FETCH NEXT语法。
Simon Ordo
Simon Ordo
发布于 2018-11-13
0 人赞同

它在RC 1中被破坏了。 必须等待获得RC 2。

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

非常有用的链接。它帮助我解决了我的问题,使用:options.UseSqlServer(connection, b => b.UseRowNumberForPaging())。
非常有帮助! useRowNumberForPaging() ,解决了我的问题。
user7313094
user7313094
发布于 2018-11-13
0 人赞同

这个功能在EF Core 3.x中被 移除 UseRowNumberForPaging 被标记为过时。然而,你可以使用 EfCore3.SqlServer2008Query 包来代替。在Nuget中有两个包,一个用于>=.NET 5.0,另一个用于>=.NET 3.1。

使用方法。

 services.AddDbContext<MyDbContext>(o => 
       o.UseSqlServer(Configuration.GetConnectionString("Default"))
        .ReplaceService<IQueryTranslationPostprocessorFactory, SqlServer2008QueryTranslationPostprocessorFactory>());
    
Salman Taj
Salman Taj
发布于 2018-11-13
0 人赞同

MyDbConnectionString 是任何来源的连接字符串。

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

UseRowNumberForPaging() 在任何情况下都解决了问题,除了edmx文件的情况。

因为SQL Server 2008不支持FETCH和FETCH OFFSET,需要orderby() skip()和take()。
Belen Martin
Belen Martin
发布于 2018-11-13
0 人赞同

你需要使用像这样的东西。

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);
    
你为什么要做pageSize+1?
Ali Besharati
Ali Besharati
发布于 2018-11-13
0 人赞同