有这种需求的背景:
如果是efcore3.0后的版本,数据库分页查询语法是用的新语法,老的数据库版本则不支持。
测试了新的分页写法"OFFSET 0 ROWS FETCH NEXT @__p_0 ROWS ONLY",已不用row_number来实现。但是新的写法无法满足老版本数据库(比如sql2008)
刚测试了一下,框架版本3.1,但是efcore版本用2.2,编译没有问题,但是加载的时候是会提示错误的(测试的是Pomelo.EntityFrameworkCore.MySql)。
具体错误如下:
System.TypeLoadException:“Method 'get_Info' in type 'Pomelo.EntityFrameworkCore.MySql.Infrastructure.Internal.MySqlOptionsExtension' from assembly 'Pomelo.EntityFrameworkCore.MySql, Version=2.2.6.0, Culture=neutral, PublicKeyToken=null' does not have an implementation.”
---------------------------------------------------
是否只能降框架版本和efcore版本,或者升级数据库版本来解决呢?
上面测试分页查询的是在框架版本3.1+efcore3.1的版本,数据库是sqlserver2008,提示分页语法不支持。
另外为了解决上面这个问题,就尝试用框架版本3.1+efcore2.2.6(pomelo.mysql.efcore)。编译是正常,但是加载数据库上下文的时候异常了。
你得确定一下到底用SQL SERVER 还是 MYSQL,哪有用MYSQL测试SQL SERVER的。
没有用mysql测试sql server,上面说的是测试了两种情况
@Code_Song:
Pomelo.EntityFrameworkCore.MySql 这个库我没用过,不好意思。
一般几百年也没机会换数据库的,为了换数据库进行设计,只会让自己难堪。
如果你可以升级SQL SERVER,那当然是升级SQL SERVER了。
微软这么大的公司都可以说不支持2008就不支持了,还不是因为兼容成本居高。
@爱编程的大叔: 现在是升级了框架版本和efcore版本,但是新版本的分页语法,在老的数据库上就不支持了。老数据库还是需要用row_number这种写法。
@Code_Song: 没办法啊。
要么升级SQL到2012。
要么就用回EF 2.2。
break changes in EF Core 3
@爱编程的大叔: 嗯呢,好
配置的地方有个方法名叫 UseRownumberPaging() ,兼容08以下数据库的
楼上的链接里有解决方法
https://github.com/dotnet/efcore/issues/16400#issuecomment-573325540
打开上面链接, 代码点开 详细信息
已经用过一段时间了, 暂时没有发现bug
请问那段代码怎么用?应该放到项目里的哪个地方?我是初学者,看不明白到底在自己的项目里如何使用
@廉毅: 新建一个类, 把代码复制进去, 放到和ef同一项目下, 然后在项目里找到xxx.UseSqlServer() 这段代码, 在上面加一行代码 xxx.DbContextOptions.ReplaceService<IQueryTranslationPostprocessorFactory, SqlServer2008QueryTranslationPostprocessorFactory>();
@Angel〆汐: 好的,非常感谢!