从另一个项目添加对 ApiAuthorizationDbContext 的迁移 - EF Core

vie*_*ule 5 c# entity-framework entity-framework-core .net-core

我正在尝试ApiAuthorizationDbContext从另一个 .NET Core 项目添加迁移,但无法从设计时实例化它,因为我不知道如何获取第二个参数IOptions<OperationalStoreOptions>

这是我的 DbContext 构造函数(它继承了我ApiAuthorizationDbContext接受 TUser、TRole、TKey 的自定义)

public class ApplicationDbContext : ApiAuthorizationDbContext<ApplicationUser, ApplicationRole, Guid>
{
    public ApplicationDbContext (DbContextOptions options, IOptions<OperationalStoreOptions> operationalStoreOptions)
        : base(options, operationalStoreOptions)
    {
    }
Run Code Online (Sandbox Code Playgroud)

这是我的 DesignTimeDbContextFactory

public class DesignTimeDbContextFactory : IDesignTimeDbContextFactory<KontestDbContext>
{
    public ApplicationDbContext CreateDbContext(string[] args)
    {
        IConfiguration configuration = new ConfigurationBuilder()
            .SetBasePath(Directory.GetCurrentDirectory())
            .AddJsonFile("appsettings.json").Build();

        var builder = new DbContextOptionsBuilder<ApplicationDbContext>();
        var connectionString = configuration.GetConnectionString("DefaultConnection");
        builder.UseSqlServer(connectionString);

        return new ApplicationDbContext(builder.Options, ????); <--- how to resolve the IOptions<OperationStoreOptions> here ??
    }
}
Run Code Online (Sandbox Code Playgroud)

在 GitHub 中找到了这个问题的答案,但仍然无法找到解决此参数的方法。

我也尝试将 IOptions<> 注入构造函数,但是在添加迁移时,它抛出一个异常,即找不到 DesignTimeDbContextFactory 的无参数构造函数

有人可以通过这个给我一个提示,我对 .NET Core / EF Core 很陌生,如果有人可以提供帮助,我会非常感谢!

(我使用 .NET Core 3.0 和 Entity Framework Core)

sha*_*aka 8

创建OperationalStoreOptionsMigrations继承IOptions并通过OperationalStoreOptionsMigrations对象。看我的回答。

  1. 创建OperationalStoreOptionsMigrations方法。

     public class OperationalStoreOptionsMigrations : 
       IOptions<OperationalStoreOptions>
     {
           public OperationalStoreOptions Value => new OperationalStoreOptions()
           {
                 DeviceFlowCodes = new TableConfiguration("DeviceCodes"),
                 EnableTokenCleanup = false,
                 PersistedGrants = new TableConfiguration("PersistedGrants"),
                 TokenCleanupBatchSize = 100,
                 TokenCleanupInterval = 3600,
           };
     }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 更改DesignTimeDbContextFactory

     public class DesignTimeDbContextFactory : 
       IDesignTimeDbContextFactory<KontestDbContext>
     {
         public ApplicationDbContext CreateDbContext(string[] args)
         {
                 IConfiguration configuration = new ConfigurationBuilder()
                 .SetBasePath(Directory.GetCurrentDirectory())
                 .AddJsonFile("appsettings.json").Build();
    
                 var builder = new DbContextOptionsBuilder<ApplicationDbContext>();
                 var connectionString = 
                     configuration.GetConnectionString("DefaultConnection");
                     builder.UseSqlServer(connectionString);
    
                 return new ApplicationDbContext(builder.Options, new OperationalStoreOptionsMigrations()); 
            }
       }
    
    Run Code Online (Sandbox Code Playgroud)


For*_*a12 -3

将您IOptions<OprerationalStoreOption>作为构造函数中的参数传递,然后您可以在任何需要的地方使用它。IOptions然后在容器中注册服务DI。像这样的东西

public ApplicationDbContext CreateDbContext(string[] args, Options<OperationStoreOptions> optionsBuilder)
    {
        IConfiguration configuration = new ConfigurationBuilder()


        return new ApplicationDbContext(builder.Options, optionsBuilder);
    }


Run Code Online (Sandbox Code Playgroud)

  • 我尝试添加它,但 CreateDbContext 只接受一个参数,因为该类必须在其接口 IDesignTimeDbContextFactory 中实现 CreateDbContext。我还尝试将 IOptions&lt;&gt; 注入构造函数,但在添加迁移时,它会抛出异常,找不到 DesignTimeDbContextFactory 的无参数构造函数。 (3认同)