netcorepal / netcorepal-cloud-framework

基于 ASP.NET Core 的领域驱动设计微服务架构实现方案
https://netcorepal.github.io/netcorepal-cloud-framework/
MIT License
97 stars 26 forks source link

关于用DbContextDesignFactory做数据执行迁移命令 #33

Closed MingHuiJian closed 1 month ago

MingHuiJian commented 1 month ago

因为我想将Migrations文件放到Infrastructure,所以使用IDesignTimeDbContextFactory接口 在new DbContextOptionsBuilder时因为框架的构造AppDbContextBase构造函数必须要有IMediator,使用数据库迁移命令总是报错 public class ApplicationDbContextDesignFactory : IDesignTimeDbContextFactory { public XxxxDbContextCreateDbContext(string[] args) { IServiceCollection services = new ServiceCollection(); var provider = services.BuildServiceProvider(); services.AddMediatR(cfg => cfg.RegisterServicesFromAssemblies(Assembly.GetExecutingAssembly())); var mediator = provider.GetRequiredService(); return new(new DbContextOptionsBuilder() .UseMySql("Server=****;User ID=mesuser;Password=**;Port=3337;Database=Xxxx;CharSet=UTF8mb4;SslMode=none;AllowPublicKeyRetrieval=true", new MySqlServerVersion(new Version(8, 0, 32))).Options, mediator, provider); } }

Unable to create a 'DbContext' of type ''. The exception 'No service for type 'MediatR.IMediator' has been registered.' was thrown while attempting to create an instance. For the different patterns supported at design time, see https://go.microsoft.com/fwlink/?linkid=851728

witskeeper commented 1 month ago

有StackTrace信息吗?

witskeeper commented 1 month ago

XxxxDbContext 的定义是否将参数传给AppDbContextBase

MingHuiJian commented 1 month ago

只是在包管理器执行迁移命令Add-Migration InitialCreate没有StackTrace信息

MingHuiJian commented 1 month ago

XxxxDbContext 将参赛数传给AppDbContextBase了的 public XxxxDbContext (DbContextOptions options, IMediator mediator, IServiceProvider provider) : base( options, mediator, provider) { Database.EnsureCreated(); }

MingHuiJian commented 1 month ago

是不是Infrastructure没有MediatR 处理程序注册服务注册不了

witskeeper commented 1 month ago

这两行代码顺序错了

var provider = services.BuildServiceProvider();
services.AddMediatR(cfg => cfg.RegisterServicesFromAssemblies(Assembly.GetExecutingAssembly()));、

你应该先 AddMediatRBuildServiceProvider,改成下面这样应该就可以了:

services.AddMediatR(cfg => cfg.RegisterServicesFromAssemblies(Assembly.GetExecutingAssembly()));
var provider = services.BuildServiceProvider();
MingHuiJian commented 1 month ago

可以了,谢谢!