Pomelo.entityframeworkcore.mysql: 脚手架 ServerVersion() 调用

创建于 2019-11-22  ·  3评论  ·  资料来源: PomeloFoundation/Pomelo.EntityFrameworkCore.MySql

我们目前没有搭建数据库服务器正在使用的ServerVersion脚手架。

随着 MySQL 兼容数据库服务器的不同实现以及 MySQL 功能方面的大量开发,我们正在 Pomelo 提供程序的许多部分使用服务器版本特定的语句。

尽管用户在设置DbContext时应始终指定预期(或最低支持)服务器版本,但许多用户不知道这一点,因此使用默认服务器版本,即最新版本。

正如我们在周三所讨论的,至少在那些用户认为脚手架代码是完整的并且不需要更改的情况下,构建实际的ServerVersion将有助于防止这个问题,这可能会导致以后的错误, 当 Pomelo 使用新引入的 MySQL 功能时,用户使用的底层数据库的旧版本尚不支持这些功能。

这将是在为 Pomelo 设置DbContext时强制明确设置服务器版本的第一步。

它应该在功能上等同于废弃的 #932 PR。

/cc @ajcvickers , @roji

type-enhancement

所有3条评论

请注意,如果您希望单例服务受版本影响(例如 TypeMappingSource、QuerySqlGenerator),那么除非我弄错了模型注释是不够的 - 您将需要继承 ISingletonOptions 的东西。 这将导致为不同的服务构建一个新的服务提供者,并且每个单例服务的不同实例被实例化。 您可以在NpgsqlOptions 中查看 Npgsql 如何做到这@ajcvickers可以确认我没有说任何傻话。

不幸的是,IIRC 还没有一种机制来构建数据库上下文选项,这就是该版本的实现方式。 目前没有时间找到跟踪问题,但@bricelam可以确认。

我认为我们在#961 中以类似的方式实现了它,我们在脚手架之前从连接中读取服务器版本,然后将其保存为IMySqlOptions属性(通过我们的官方DbContextBuilder扩展方法ServerVersion() ) 并调用Initialize()只要它由于某种原因尚未设置。

然后我们使用ProviderCodeGenerator.GenerateProviderOptions()来生成ServerVersion()扩展方法的代码。

所以我们不再走我们在废弃的#932 PR 中尝试的模型注释路线。 但是我们通过这个 PR 确保我们确实提供了与#932 相同的功能,但这次只是重用已经存在的ServerVersion()扩展方法。

我们需要将模型(或只是它的注释)流入提供者脚手架方法中。 由https://github.com/aspnet/EntityFrameworkCore/issues/10487跟踪

此页面是否有帮助?
0 / 5 - 0 等级