Pivot Runner: принудительное удаление существующего ограничения, которое соответствует ограничению, необходимому для новой модели.

Столкнувшись с той же проблемой, есть ли прогресс в этом вопросе: - вместо использования сводного производителя" rel="nofollow">http://www.softfluent.com/product/codefluent-entities/knowledge-center/point-sql-server-producer-to-production-db -вместо-использования-основного-производителя

Спасибо за Ваш ответ,

РЕДАКТИРОВАТЬ: это код, используемый для удаления всех ограничений

    private static void RemoveCodeFluentConstraintsTable(IList<PivotRunnerConstraint> constraints, String connectionString)
    {

        using (SqlConnection con = new SqlConnection(connectionString))
        {
            con.Open();

            // Set up a command with the given query and associate
            // this with the current connection.
            using (SqlCommand cmd = new SqlCommand("SELECT tables.name as tableName, default_constraints.name as constraintName FROM sys.all_columns INNER JOIN sys.tables ON all_columns.object_id = tables.object_id INNER JOIN sys.schemas ON tables.schema_id = schemas.schema_id INNER JOIN sys.default_constraints ON all_columns.default_object_id = default_constraints.object_id", con))
            {

                foreach (PivotRunnerConstraint constraint in constraints)
                {
                    String tableName = constraint.ParentName;
                    String constraintName = constraint.Name;
                    if (tableName != null && constraintName != null)
                    {
                        SqlCommand cmdConstraint = new SqlCommand("ALTER TABLE [MySchema].[" + tableName + "] DROP CONSTRAINT [" + constraintName + "]", con);
                        cmdConstraint.ExecuteNonQuery();
                    }

                }
                //con.Close();
            }
        }
        return;
    }

person Olivier ROMAND    schedule 01.04.2016    source источник
comment
Изначально я разместил вопрос в этой теме. Мое решение состояло в том, чтобы удалить все ограничения в производственной базе данных. После того, как я сделал это один раз, мне больше никогда не приходилось делать это, и SQL Server Pivot Producer работал без ошибок. К сожалению, у меня нет точного кода, который я использовал для удаления всех ограничений, но самая важная часть была включена в конец статьи базы знаний. Конечно, сначала я проверяю это на резервной копии рабочей базы данных. Я подозреваю, что причиной моей проблемы был запуск Pivot Producers из моментальных снимков виртуальной машины, сделанных в разные моменты времени.   -  person Dave    schedule 01.04.2016
comment
У меня возникла точно такая же проблема, когда я добавил таблицу, имя которой было достаточно близким, чтобы столкнуться с именованием ограничений. Возможно ли также, что таблица PK может страдать от этого ограничения? Позже я опубликую написанный мной код для удаления ограничений в БД, но столкнулся с другой проблемой: OBJECT_DEFINITION возвращает null, а столбец уже имеет привязанное к нему значение DEFAULT. для столбцов _trackLast*; причина или следствие...? Я еще не нашел подсказку.   -  person Olivier ROMAND    schedule 01.04.2016
comment
Это тесно связано с тем, чего мы хотим достичь: >softfluent.com/product/codefluent-entities/knowledge-center/   -  person Olivier ROMAND    schedule 04.04.2016


Ответы (1)


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

 public class MyNamingConvention : FormatNamingConvention
    {
        public override string GetName(INamedObject obj, IDictionary context)
        {
            Column column = obj as Column;
            if (column != null && column.Table != null)
            {
                var name = context["name"] as string;
                if (name != null && (name.StartsWith("DF_")))
                {
                    return column.Table.Name + base.GetName(obj, context);
                }
            }
            return base.GetName(obj, context);
        }
    }

В то же время мне также пришлось удалить существующие ограничения, чтобы избежать коллизии:

private static void RemoveCodeFluentConstraints(string connectionString)
    {

        using (SqlConnection con = new SqlConnection(connectionString))
        {
            con.Open();

            // Set up a command with the given query and associate
            // this with the current connection.
            using (SqlCommand cmd = new SqlCommand("SELECT c.name, t.name FROM sys.objects c, sys.objects t, sys.schemas s WHERE c.type IN('F', 'PK', 'FK', 'UQ', 'D') AND c.parent_object_id = t.object_id and t.SCHEMA_ID = s.schema_id AND t.type = 'U' AND s.name = 'MySchema' ORDER BY c.type", con))
            {
                using (IDataReader dr = cmd.ExecuteReader())
                {
                    using (SqlConnection con1 = new SqlConnection(connectionString))
                    {
                        con1.Open();
                        while (dr.Read())
                        {
                            String constraintName = dr[0].ToString();
                            String tableName = dr[1].ToString();
                            if (tableName != null && constraintName != null)
                            {
                                String cmdConstraintSql = "ALTER TABLE [MySchema].[" + tableName + "] DROP CONSTRAINT [" + constraintName + "]";
                                ActivityLog.Write("Execute " + cmdConstraintSql, ActivityLogsFile);
                                SqlCommand cmdConstraint = new SqlCommand(cmdConstraintSql, con1);
                                cmdConstraint.ExecuteNonQuery();
                            }

                        }
                        con1.Close();
                    }
                }
            }
            con.Close();
        }
        return;
    }

Другая проблема была связана с неправильным выбором определения сводного файла: нулевая команда Pivot Runner

person Olivier ROMAND    schedule 06.04.2016