首页 > 解决方案 > FluentMigrator - 将列添加到循环中的每个表

问题描述

我正在尝试创建将列“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();
        }

标签: c#fluent-migrator

解决方案


如果您询问如何获取表名:

MigrationBase 类(Migration 的父级)具有 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();
}

推荐阅读