Как я могу передать параметры при миграции?

#c# #entity-framework #entity-framework-core

Вопрос:

Я хочу передать параметры в рамках начальной миграции и запустить среду выполнения миграции. (С помощью кода c#, а не с помощью команд PM)

В приведенном ниже примере я пытаюсь сделать это с помощью конструктора (имя параметра tableName)

 public interface IDbContextSchema
{
    string TableName { get; set; }
}

public partial class v1 : Migration, IDbContextSchema
{
    public string TableName { get; set;}

    public v1(string tableName)
    {
        TableName = tableName;
    }

    protected override void Up(MigrationBuilder migrationBuilder)
    {
        migrationBuilder.CreateTable(
            name: TableName,
            columns: table => new
            {
                Id = table.Column<int>(nullable: false)
                    .Annotation("SqlServer:Identity", "1, 1"),
                CustomerName = table.Column<string>(nullable: true)
            },
            constraints: table =>
            {
                table.PrimaryKey($"PK_WU_{TableName}", x => x.Id);
            });
    }

    protected override void Down(MigrationBuilder migrationBuilder)
    {
        migrationBuilder.DropTable(
            name: TableName);
    }
}
 

Похоже, что описанный выше подход сделает свое дело.
Но как я должен запустить среду выполнения миграции?

Ответ №1:

Вы можете начать миграцию вручную (из кода C#) с context.Database.Migrate() помощью команды.

Проверьте код функции переноса, и вы увидите, что она использует [IMigrator][2] функцию, которая генерирует код.

Там вы можете найти, как получить контроль над сборкой миграции ((IInfrastructure<IServiceProvider>)context.Database).Instance.GetService<IMigrationsAssembly>() (пожалуйста, дважды проверьте, возвращает ли она значение).

IMigrationsAssembly имеет функцию CreateMigration , которая принимает [TypeInfo][2] параметр.

Я предполагаю, что это был бы способ создания классов, динамически унаследованных от вашего базового класса миграции, но с переопределенным параметром конструктора, определяющим имя таблицы