FluentMigrator — добавление столбца в каждую таблицу цикла

#c# #fluent-migrator

Вопрос:

Я пытаюсь создать код, который добавляет столбец «externalId» почти в каждую таблицу в цикле foreach, за некоторыми исключениями. Если имя схемы таблицы равно «Планировщик» или имя таблицы начинается с «пользователи», не добавляйте столбец.

Во-первых, мне, вероятно, понадобится список схем и таблиц.

 public class AddExternalIdColumnsToManyTables : Migration
{
    public override void Up()
    {
        // schema name example
        // Scheduler.Job

        // dbo.users_logins

        var schemaAndTableNames = new List<string>();

        foreach (var item in schemaAndTableNames)
        {
            if (item.StartsWith("Scheduler"))
            {
                continue;
            }

            if (item.Split('.')[1].StartsWith("users"))
            {
                continue;
            }

            Alter.Table(item.Split('.')[1]).AddColumn("ExternalId").AsInt32().Nullable();
        }
 

Ответ №1:

Если вы спрашиваете, как получить имена таблиц:

Класс MigrationBase (родительский класс миграции) имеет свойство ConnectionsString. Вы можете легко получить его и написать ADO.net запрос для получения имен таблиц. Простой пример:

 var builder = new SqlConnectionStringBuilder(ConnectionString);
var query = "SELECT TABLE_NAME"   
            "FROM INFORMATION_SCHEMA.TABLES"   
            "WHERE TABLE_TYPE = 'BASE TABLE' AND "  
            $"TABLE_CATALOG = '{builder.InitialCatalog}'"    

using (var connection = new SqlConnection(builder.ConnectionString))
{
    connection.Open();
    var command = new SqlCommand(query, connection);
    using (var sqlReader = command.ExecuteReader(CommandBehavior.KeyInfo))
    {
        var schemaTable = sqlReader.GetSchemaTable();
        foreach (DataRow row in schemaTable.Rows)
        {
              ///your table names
        }
    }
    connection.Close();
}