Рекомендации по автоматизации переименования таблиц / столбцов в SQL Server и обновлению сопоставлений Entity Framework в Visual Studio - PullRequest
0 голосов
/ 04 апреля 2011

Привет всем; Я хочу создать инструмент, который принимает два словарных объекта,

Dictionary<string, string> tableNames, Dictionary<string, string> columnNames

где ключ - это старая строка имени таблицы, которую следует переименовать, а значение - новая строка для имени таблицы. В одном словаре есть имена таблиц, которые необходимо обновить, а в другом - имена столбцов, которые необходимо обновить. Словарь, содержащий имена столбцов, - это все, что можно использовать для обновления имен столбцов таблицы; связанная таблица, в которой находятся столбцы, будет неизвестна или не будет иметь значения, поскольку я по сути буду менять имя столбца, если ЛЮБАЯ таблица будет иметь конкретную строку имени столбца.

Я смог выполнить описанные выше шаги в порядке со следующим кодом:

Изменить имена таблиц.

using (SqlCommand cmd = new SqlCommand())
{
    foreach (KeyValuePair<string, string> keyValuePair in tableNames)
    {
        cmd.Connection = connection;
        cmd.Parameters.Clear();
        cmd.CommandText = "sp_RENAME";
        cmd.CommandType = System.Data.CommandType.StoredProcedure;

        cmd.Parameters.Add(new SqlParameter("@objname", keyValuePair.Key));
        cmd.Parameters.Add(new SqlParameter("@newname", keyValuePair.Value));

        try 
        {
            cmd.ExecuteNonQuery(); 
        }
        catch (Exception e) 
        {
            var v = e.Message; 
        }
    }
}

Изменить имена столбцов.

DataTable dt = connection.GetSchema("Tables");

foreach (DataRow dataRow in dt.Rows)
{
    string tableName = dataRow.Field<string>("TABLE_NAME");

    foreach (KeyValuePair<string, string> keyValuePair in columnNames)
    {
        using (SqlCommand cmd = new SqlCommand())
        {
            cmd.Connection = connection;
            cmd.Parameters.Clear();
            cmd.CommandText = "sp_RENAME";
            cmd.CommandType = System.Data.CommandType.StoredProcedure;

            cmd.Parameters.Add(new SqlParameter("@objname", tableName + "." + keyValuePair.Key));
            cmd.Parameters.Add(new SqlParameter("@newname", keyValuePair.Value));
            cmd.Parameters.Add(new SqlParameter("@objtype", "COLUMN"));

            try 
            {
                cmd.ExecuteNonQuery(); 
            }
            catch (Exception e) 
            { 
                var v = e.Message; 
            }
        }
    }
}

Итак, это круто. Тем не менее, у меня есть около 80+ проектов в решении, где используется Entity Framework, и у меня есть много файлов edmx и edmx.Designer.cs. Всякий раз, когда таблица изменяется, я перехожу к файлу edmx, в котором есть таблица, удаляю таблицу, щелкаю правой кнопкой мыши по пустому пространству и заново добавляю таблицу, выбирая «Обновить модель из базы данных ...».

Я хотел бы получить совет о том, как я могу автоматизировать эти шаги, чтобы я мог перебирать более 80 проектов и обновлять все сопоставления таблиц, либо с помощью грубой силы (удалять и повторно добавлять все таблицы в файле edmx), либо, возможно, Я могу хранить список таблиц, которые были изменены в моем коде, и обновлять только эти таблицы.

Кроме того, если я могу что-то улучшить в приведенном выше коде, пожалуйста, дайте мне знать. У меня есть только некоторый опыт программирования для баз данных, поэтому советы, связанные с этим, также приветствуются. Спасибо!

1 Ответ

1 голос
/ 04 апреля 2011

Почему вы переименовываете таблицы или столбцы, которые используются в 80 проектах ???Я не могу себе представить причину, которая заставила бы меня сделать такую ​​глупость.

В любом случае, если вы хотите изменить только имена таблиц и столбцов, вы можете открыть все файлы EDMX в виде XML и изменить их части SSDL и MSL,Часть SSDL содержит описание всех таблиц (+ их столбцы) и отношений, используемых в отображении, а часть MSL описывает отображение между таблицами и классами.Это не изменит названия классов или свойств.Если вы хотите изменить их, вы должны сначала также изменить CSDL (описание классов).Тогда это будет большая работа, потому что переименование класса или свойства в EDMX потребует изменения всех .cs / .vb / .aspx / etc.файлы, определяющие или использующие это.Это похоже на запуск рефакторинга из вашего кода ( это должно быть возможно ).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...