Skip to content

重构数据迁移上下文提供器IDesignTimeDbContextFactory<TDbContext>接口的实现 #180

@gmf520

Description

@gmf520

您的功能请求与现有问题有关吗?请描述

原实现 SqlServerDesignTimeDefaultDbContextFactory.cs 存在以下几个问题,需要优化:

  1. 当进行数据迁移时,没有经过WebHost和Startup的初始化,无法提供一个IServiceProvider来提供IoC服务,需要手动读取配置文件获取数据库连接之类的配置
  2. 因为没有IServiceProvider,一切需要的服务都只能通过 new 的方式来获得实例,与.netcore一切皆服务的初衷格格不入
  3. 创建一个数据上下文实例,需要构建一个DbContextOptionsBuilder,在这 AddOsharpDbContext 已经构建过,可复用
  4. 需要针对每个数据库驱动进行 UseSql 的处理,这与EFCore模块中的DbContextOptionsBuilderDriveHandler重复了,可以复用

描述您想要的解决方案

针对如上几个问题,可以重构如下

  1. 移除数据库驱动平台差异,针对一个数据上下文(如 DefaultDbContext),只需要创建一个IDesignTimeDbContextFactory<TDbContext>接口的实现
  2. 当IServiceProvider不存在时,调用Startup进行IServiceCollection的构建,从而获得全服务的IServiceProvider
  3. 将 DbContextOptionsBuilder 的构建从AddOsharpDbContext提取出来进行复用
  4. 调用现有的各数据库驱动差异处理类DbContextOptionsBuilderDriveHandler进行各驱动的UseSql操作
  5. 如此,新的 DesignTimeDefaultDbContextFactory 只需要重写实现一个 CreateDesignTimeServiceProvider 方法即可,相比原先的一个驱动一个文件要简化很多

Metadata

Metadata

Assignees

No one assigned

    Labels

    Breaked Changes ⚡更新有破坏性,对现有业务实现有较大影响Feature 🔨新功能,新特性Finished ✔️实现并完工Useful 💯对于解决问题有帮助

    Type

    No type

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions