Alva

Alva

programmer
github
telegram
email

Abp フレームワークの統一設定テーブル名プレフィックスとスキーマ

太長不看版:

内蔵テーブルについて、すべての起動プロジェクト(XXX.DbMigrator を除く)の Program.cs ファイルと XXXDbContextFactory で、AbpCommonDbPropertiesAbpOpenIddictDbProperties の値を設定します。

自分たちのエンティティテーブルの場合は、XXX.Domain/XXXConsts.cs ファイルを見つけて、関連する値を変更すればよいです。

Abp フレームワーク自体には、AbpAuditLogs、AbpAuditLogActions テーブルなどのいくつかのテーブルが含まれており、Abp はテーブル名のプレフィックスであり、この値は変更可能です。

Abp 内蔵テーブルのテーブル名プレフィックスとスキーマの変更#

テンプレートプロジェクトの生成#

まず、Cli を使用してテンプレートプロジェクトを生成します。

// abp version 6.0.2
abp new MyApp

生成されたプロジェクトを開き、MyApp.EntityFrameworkCore プロジェクトを見つけます。

Migrations/MyAppDbContextModelSnapshot.cs ファイルを開き、約 144 行目に次の行があるのが見えます。

b.ToTable("AbpAuditLogs", (string)null);

デフォルトで生成されたテンプレートプロジェクトでは、Abp をテーブルプレフィックスとして使用し、スキーマは null に設定されています。

この Migrations フォルダーを削除します。

テーブル名プレフィックスを設定する場所を見つける#

再び MyApp.EntityFrameworkCore プロジェクトに戻り、EntityFrameworkCore/MyAppDbContext.cs ファイルを見つけます。

public class MyAppDbContext :
    AbpDbContext<MyAppDbContext>,
    IIdentityDbContext,
    ITenantManagementDbContext
{
    // ...

    protected override void OnModelCreating(ModelBuilder builder)
    {
        base.OnModelCreating(builder);

        // ここでいくつかの内蔵テーブルの設定を行っています
        builder.ConfigurePermissionManagement();
        builder.ConfigureSettingManagement();
        builder.ConfigureBackgroundJobs();
        builder.ConfigureAuditLogging();
        builder.ConfigureIdentity();
        builder.ConfigureOpenIddict();
        builder.ConfigureFeatureManagement();
        builder.ConfigureTenantManagement();

        // ...
    }
}

OnModelCreating メソッドを見つけ、これらの builder.ConfigureXXX() メソッドに入って、ソースコードの実装を確認します。

Ctrl キーを押しながら左クリックすると、逆コンパイルされ、Abp の対応するソースコードが表示されます。ConfigurePermissionManagement メソッドを開くと、次のコードが見えます。

public static void ConfigurePermissionManagement([NotNull] this ModelBuilder builder)
{
    // ...

    builder.Entity<PermissionGrant>(b =>
    {
        // ここでテーブル名プレフィックスとスキーマを設定しています
        b.ToTable(AbpPermissionManagementDbProperties.DbTablePrefix + "PermissionGrants", AbpPermissionManagementDbProperties.DbSchema);

        // ...
    });

    // ...
}

PermissionGrant エンティティに対応するテーブル名の設定が AbpPermissionManagementDbProperties に関連付けられているのが見えます。他の builder.ConfigureXXX() メソッドを開いても、同様の設定が見られます。
次に AbpPermissionManagementDbProperties クラスを見つけて、さらに探ります。

public static class AbpPermissionManagementDbProperties
{
    public static string DbTablePrefix { get; set; } = AbpCommonDbProperties.DbTablePrefix;

    public static string DbSchema { get; set; } = AbpCommonDbProperties.DbSchema;

    public const string ConnectionStringName = "AbpPermissionManagement";
}

PermissionGrant エンティティに関するすべての設定、テーブル名プレフィックス DbTablePrefix、スキーマ DbSchema、およびデータベース接続文字列名 ConnectionStringName が表示されます。つまり、プロジェクトの起動時にこれらの値を個別に変更することで、関連する設定を変更できます。

AbpPermissionManagementDbProperties クラスのテーブル名プレフィックス DbTablePrefix とスキーマ DbSchemaAbpCommonDbProperties クラスに依存しているため、このクラスの実装を見つけます。

public static class AbpCommonDbProperties
{
    /// <summary>
    /// このテーブルプレフィックスはほとんどの ABP モジュールで共有されています。
    /// これを変更することで、すべてのモジュールのテーブルプレフィックスを設定できます。
    ///
    /// デフォルト値: "Abp"。
    /// </summary>
    public static string DbTablePrefix { get; set; } = "Abp";

    /// <summary>
    /// デフォルト値: null。
    /// </summary>
    public static string DbSchema { get; set; } = null;
}

この設定項目は、デフォルトテンプレート生成の設定と一致し、テーブル名プレフィックスは Abp で始まり、スキーマは null に設定されています。基本設定項目を見つけたので、デフォルトの設定を変更できます。

デフォルト設定の変更#

すべての起動プロジェクト(XXX.DbMigrator を除く)の Program.cs ファイルと XXXDbContextFactory.cs ファイルで設定を行います。

// すべての起動プロジェクト(`XXX.DbMigrator` を除く)
public class Program
{
    public async static Task<int> Main(string[] args)
    {
        AbpCommonDbProperties.DbSchema      = "abp";
        AbpCommonDbProperties.DbTablePrefix = "ABP_";

        // ...
    }
}

// XXXDbContextFactory.cs (デフォルト生成は XXX.EntityFrameworkCore/EntityFrameworkCore)
public XXXDbContext CreateDbContext(string[] args)
{
    AbpCommonDbProperties.DbSchema      = "abp";
    AbpCommonDbProperties.DbTablePrefix = "ABP_";

    // ...
}

初回マイグレーションコードの生成#

まず、XXX.EntityFrameworkCore プロジェクト内の Migrations フォルダーを削除します。ここには元々生成されたマイグレーションファイルがあります。
次に XXX.DbMigrator プロジェクトを実行して、マイグレーションファイルを生成します。

再度 Migrations/MyAppDbContextModelSnapshot.cs ファイルを開き、144 行目を見つけると、生成されたマイグレーションコードに私たちの設定が適用されているのが見えます。

// テーブル名プレフィックス ABP_
// スキーマ abp
b.ToTable("ABP_AuditLogs", "abp");

特殊なテーブル#

マイグレーションを実行した後、データベースを確認すると、4 つのテーブルのテーブル名プレフィックスとスキーマが私たちの期待通りに設定されていないことがわかります。これらのテーブルは OpenIddict をプレフィックスとしています。

コードに戻り、MyAppDbContext.cs ファイルの OnModelCreating メソッドを見つけると、次の行が見つかります。

builder.ConfigureOpenIddict();

ソースコードを逆コンパイルして確認すると、OpenIddict をプレフィックスとするいくつかのエンティティクラスがあり、テーブル設定が AbpOpenIddictDbProperties クラスに関連付けられていますが、AbpOpenIddictDbProperties クラスの設定は AbpCommonDbProperties に依存していないため、これらのエンティティを個別に設定する必要があります。

// 前述の Program.cs と XXXDbContextFactory.cs に以下の設定を追加
AbpOpenIddictDbProperties.DbSchema      = "abp";
AbpOpenIddictDbProperties.DbTablePrefix = "ABP_";

再度 Migrations フォルダーを削除し、データベースをクリアしてから XXX.DbMigrator プロジェクトを実行し、マイグレーションを適用すると、データベースに生成されたテーブルが表示されます。

個別設定#

MyAppDbContext.cs ファイルの OnModelCreating メソッドの以下のコードから、いくつかの関連設定を見つけることができ、ソースコードを逆コンパイルして各設定が依存する XXXDbProperties を見つけ、Program.csXXXDbContextFactory.cs ファイルに相応しい設定を追加すればよいです。

builder.ConfigurePermissionManagement();
builder.ConfigureSettingManagement();
builder.ConfigureBackgroundJobs();
builder.ConfigureAuditLogging();
builder.ConfigureIdentity();
builder.ConfigureOpenIddict();
builder.ConfigureFeatureManagement();
builder.ConfigureTenantManagement();

ユーザーテーブルのテーブル名プレフィックスとスキーマ#

ユーザーテーブルのこれらの設定は比較的簡単で、生成されたコードの中で直接見つけることができます。

// MyApp.Domain プロジェクト
// MyAppConsts クラス
public static class MyAppConsts
{
    public const string DbTablePrefix = "App";

    public const string DbSchema = null;
}

これらの設定を変更すれば大丈夫です。

読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。