首页 新闻 会员 周边 捐助

netcore3.1框架版本无法兼容数据库EFCore2.2版本,有什么好的办法?

0
悬赏园豆:10 [已解决问题] 解决于 2020-07-15 16:00

有这种需求的背景:

如果是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)。编译是正常,但是加载数据库上下文的时候异常了。

Code_Song的主页 Code_Song | 初学一级 | 园豆:51
提问于:2020-07-08 17:44
< >
分享
最佳答案
1
收获园豆:5
dudu | 高人七级 |园豆:30257 | 2020-07-08 18:16

thanks,dudu

Code_Song | 园豆:51 (初学一级) | 2020-07-09 09:38
其他回答(4)
0

你得确定一下到底用SQL SERVER 还是 MYSQL,哪有用MYSQL测试SQL SERVER的。

收获园豆:2
爱编程的大叔 | 园豆:30844 (高人七级) | 2020-07-08 17:46

没有用mysql测试sql server,上面说的是测试了两种情况

支持(0) 反对(0) Code_Song | 园豆:51 (初学一级) | 2020-07-08 17:53

@Code_Song:
Pomelo.EntityFrameworkCore.MySql 这个库我没用过,不好意思。

一般几百年也没机会换数据库的,为了换数据库进行设计,只会让自己难堪。

如果你可以升级SQL SERVER,那当然是升级SQL SERVER了。
微软这么大的公司都可以说不支持2008就不支持了,还不是因为兼容成本居高。

支持(0) 反对(0) 爱编程的大叔 | 园豆:30844 (高人七级) | 2020-07-08 17:56

@爱编程的大叔: 现在是升级了框架版本和efcore版本,但是新版本的分页语法,在老的数据库上就不支持了。老数据库还是需要用row_number这种写法。

支持(0) 反对(0) Code_Song | 园豆:51 (初学一级) | 2020-07-08 18:00

@Code_Song: 没办法啊。
要么升级SQL到2012。
要么就用回EF 2.2。
break changes in EF Core 3

支持(0) 反对(0) 爱编程的大叔 | 园豆:30844 (高人七级) | 2020-07-08 18:08

@爱编程的大叔: 嗯呢,好

支持(0) 反对(0) Code_Song | 园豆:51 (初学一级) | 2020-07-08 18:36
0

配置的地方有个方法名叫 UseRownumberPaging() ,兼容08以下数据库的

收获园豆:1
等一个,晴天 | 园豆:3 (初学一级) | 2020-07-09 09:43
0

楼上的链接里有解决方法
https://github.com/dotnet/efcore/issues/16400#issuecomment-573325540
打开上面链接, 代码点开 详细信息

已经用过一段时间了, 暂时没有发现bug

收获园豆:1
Angel〆汐 | 园豆:211 (菜鸟二级) | 2020-07-09 13:11

请问那段代码怎么用?应该放到项目里的哪个地方?我是初学者,看不明白到底在自己的项目里如何使用

支持(0) 反对(0) 廉毅 | 园豆:202 (菜鸟二级) | 2020-07-30 14:01

@廉毅: 新建一个类, 把代码复制进去, 放到和ef同一项目下, 然后在项目里找到xxx.UseSqlServer() 这段代码, 在上面加一行代码 xxx.DbContextOptions.ReplaceService<IQueryTranslationPostprocessorFactory, SqlServer2008QueryTranslationPostprocessorFactory>();

支持(0) 反对(0) Angel〆汐 | 园豆:211 (菜鸟二级) | 2020-07-30 14:16

@Angel〆汐: 好的,非常感谢!

支持(0) 反对(0) 廉毅 | 园豆:202 (菜鸟二级) | 2020-07-30 15:37
0

我遇到过这个bug,后面改成mysql了,2.X版本无解
https://www.cnblogs.com/jhli/p/9962372.html

收获园豆:1
0539 | 园豆:442 (菜鸟二级) | 2020-07-11 13:56
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册