我正在使用Azure SQL Server,并且正在从EF 6迁移到EF Core 7。
在EF 6中,Guid.ToString()
方法生成了选择查询,并在其中生成了查询,而现在,EF Core 7正在生成查询。我在我的项目中使用了很多这样的转换,那么有没有一种简单的方法来覆盖EF Core 7中Guid.ToString()
或Guid?.ToString()
生成的默认查询?
在EF Core Github中已经有一个问题。但是提供的解决方案对我的情况来说还不够好。
https://github.com/dotnet/efcore/issues/24419
1条答案
按热度按时间jpfvwuh41#
有几件事要提一下:
现在谈具体问题
那么有没有一种简单的方法来覆盖Guid.ToString()或Guid生成的默认查询呢?EF Core 7中的.ToString()?
幸运的是,EF Core是围绕服务和DI构建的,因此比EF 6更具可定制性。这并不容易,但有可能。
对于这种特殊情况,有几种方法可以覆盖默认的EF核心转换-IMethodCallTranslatorPlugin提供一个或多个自定义IMethodCallTranslator。这些都很容易实现,但不太容易插入EF Core管道(需要大量的样板管道代码)。因此,我发现使用标准的ReplaceService方法替换默认的IMethodCallTranslatorProvider服务(它使用前面提到的子服务)更容易。一个小问题是,它是特定于数据库提供程序的,因此您必须继承相应的服务实现类(在本例中-对于SqlServer,它是一个名为
SqlServerMethodCallTranslatorProvider
的类)。第二,所有这些都是公开的(幸运的是),但被标记为“EF Core内部API的一部分”,所以你必须抑制相关的警告(并观察EF Core版本的破坏性更改)。下面是EF Core 7与SqlServer数据库的解决方案:
将以上内容放在派生数据库上下文所在的项目中您选择的一个代码文件中。然后在
OnConfiguring
override中添加以下内容:然后你就完成了-所有的
Guid.ToString()
和Guid?.ToString()
投影都将被转换,就像你在最后写了附加的.ToLower()
一样。请记住,如果您的目标是SqlServer(即,
optionsBuilder.UseSqlServer(...)
)。