-
Notifications
You must be signed in to change notification settings - Fork 767
Closed
Labels
Breaked Changes ⚡更新有破坏性,对现有业务实现有较大影响更新有破坏性,对现有业务实现有较大影响Feature 🔨新功能,新特性新功能,新特性Finished ✔️实现并完工实现并完工Useful 💯对于解决问题有帮助对于解决问题有帮助
Milestone
Description
您的功能请求与现有问题有关吗?请描述
原实现 SqlServerDesignTimeDefaultDbContextFactory.cs 存在以下几个问题,需要优化:
- 当进行数据迁移时,没有经过WebHost和Startup的初始化,无法提供一个IServiceProvider来提供IoC服务,需要手动读取配置文件获取数据库连接之类的配置
- 因为没有IServiceProvider,一切需要的服务都只能通过 new 的方式来获得实例,与.netcore一切皆服务的初衷格格不入
- 创建一个数据上下文实例,需要构建一个
DbContextOptionsBuilder
,在这 AddOsharpDbContext 已经构建过,可复用 - 需要针对每个数据库驱动进行 UseSql 的处理,这与EFCore模块中的DbContextOptionsBuilderDriveHandler重复了,可以复用
描述您想要的解决方案
针对如上几个问题,可以重构如下
- 移除数据库驱动平台差异,针对一个数据上下文(如 DefaultDbContext),只需要创建一个
IDesignTimeDbContextFactory<TDbContext>
接口的实现 - 当IServiceProvider不存在时,调用Startup进行IServiceCollection的构建,从而获得全服务的IServiceProvider
- 将 DbContextOptionsBuilder 的构建从AddOsharpDbContext提取出来进行复用
- 调用现有的各数据库驱动差异处理类DbContextOptionsBuilderDriveHandler进行各驱动的UseSql操作
- 如此,新的 DesignTimeDefaultDbContextFactory 只需要重写实现一个 CreateDesignTimeServiceProvider 方法即可,相比原先的一个驱动一个文件要简化很多
Metadata
Metadata
Assignees
Labels
Breaked Changes ⚡更新有破坏性,对现有业务实现有较大影响更新有破坏性,对现有业务实现有较大影响Feature 🔨新功能,新特性新功能,新特性Finished ✔️实现并完工实现并完工Useful 💯对于解决问题有帮助对于解决问题有帮助