#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]
параметр.
Я предполагаю, что это был бы способ создания классов, динамически унаследованных от вашего базового класса миграции, но с переопределенным параметром конструктора, определяющим имя таблицы