簡體   English   中英

將服務傳遞給自定義 IMigrationHistory 實現

[英]Passing Services to custom IMigrationHistory implementation

將 PostgreSQL 與 ASP.NET Core 3.1 一起使用。 我的遷移歷史表存在於它自己的架構中,因為我們有一個多租戶設置,每個租戶都與一個單獨的架構相關聯。 我現在正在嘗試通過添加新列並將自定義值放入其中(如內部版本號)來修改遷移歷史記錄表。

現在我知道我必須重新創建模式才能在初始遷移中添加新列。

但是我沒有做的是將 IConfiguration 的一個實例傳遞給我的自定義 MigrationsHistory 實現(配置包含要插入到自定義 BuildVersion 列中的內部版本號)。 這是我在 DBContext 的OnConfiguring()方法上使用自定義替換IHistoryRepository的代碼:

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
    optionsBuilder
        .UseNpgsql(
        _tenantConnectionString,
        npgsqlOptionsAction: npgsqlOptions =>
        {
            npgsqlOptions.EnableRetryOnFailure();
            npgsqlOptions.MigrationsHistoryTable("__EFMigrationsHistory", _tenantDbSchema);
        })
        .ReplaceService<IHistoryRepository, CustomHistoryRepository>(); 
}

這是我的自定義遷移歷史表的代碼:

public class CustomHistoryRepository : NpgsqlHistoryRepository
{
    private readonly IConfiguration _configuration;

    public CustomHistoryRepository (
        [NotNull] HistoryRepositoryDependencies dependencies,
        IConfiguration configuration) 
        : base(dependencies)
    {
        _configuration = configuration;
    }

    protected override void ConfigureTable(EntityTypeBuilder<HistoryRow> history)
    {
        base.ConfigureTable(history);
        history.Property<string>("BuildVersion")
            .HasDefaultValue(_configuration["BuildVersion"] ?? "Unknown");
    }
}

現在我在構建CustomHistoryTable時無法注入 IConfiguration 。 這可能與 EF 使用內部ServiceProvider的事實有關,因此我嘗試注入自己的,但隨后我將不得不配置所有依賴項,這很多。 我對內部 EF ServiceProvider的懷疑是否正確,我該如何解決這個問題?

這似乎解決了為您自己的ServiceProvider提供最少輸入的問題,從而將所有服務(包括 IConfiguration)暴露給CustomHistoryProvider

services.AddDbContext<ApplicationDbContext>(
    options => options
        .UseInternalServiceProvider(services
            .AddEntityFrameworkNpgsql()
            .AddEntityFrameworkProxies()
            .AddScoped<IHistoryRepository, CustomHistoryRepository>()
            .BuildServiceProvider())
        .UseLazyLoadingProxies()
        .EnableSensitiveDataLogging(enableSensitiveDataLogging));

請注意, AddEntityFrameworkNpgsql()的使用特定於 PostgreSQL 的 Npgsql 提供程序。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM