【问题标题】:Add migration for ApiAuthorizationDbContext from another project - EF Core从另一个项目添加 ApiAuthorizationDbContext 迁移 - EF Core
【发布时间】:2020-03-19 10:56:27
【问题描述】:

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

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

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

这是我的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 ??
    }
}

我从this issue in GitHub 找到了答案,但仍然不知道如何解决这个参数。

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

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

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

【问题讨论】:

    标签: c# entity-framework .net-core entity-framework-core


    【解决方案1】:

    创建 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,
             };
       }
      
    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()); 
              }
         }
      

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 我尝试添加它,但 CreateDbContext 只接受一个参数,因为该类必须在其接口 IDesignTimeDbContextFactory 中实现 CreateDbContext。我也尝试将 IOptions 注入构造函数,但是在添加迁移时,它会抛出一个异常,即找不到 DesignTimeDbContextFactory 的无参数构造函数。
      猜你喜欢
      • 2018-11-30
      • 2017-05-30
      • 1970-01-01
      • 1970-01-01
      • 2017-11-30
      • 1970-01-01
      • 1970-01-01
      • 2017-04-12
      • 2021-09-28
      相关资源
      最近更新 更多