Linq2Sql Тестирование - PullRequest
       4

Linq2Sql Тестирование

1 голос
/ 31 декабря 2008

У меня есть тестовая база данных и производственная база данных. При разработке я, конечно, работаю с этой тестовой базой данных, а затем при ее развертывании мне приходится частично вручную обновлять производственную базу данных (запустив batch-sql-скрипт). Обычно это работает нормально, но есть вероятность ошибок, когда развернутая база данных отличается от тестовой базы данных.

Для таблиц: есть ли способ, которым я могу автоматически протестировать все сущности, которые я сопоставил, используя linq2sql, с производственной базой данных, чтобы все свойства и т. Д. Существовали?

Ответы [ 4 ]

5 голосов
/ 31 декабря 2008

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

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

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

Ссылка на Redgate SQL Compare

2 голосов
/ 31 декабря 2008

Насколько я могу судить, невозможно выполнить автоматическое тестирование перед отправкой. Однако вы можете сделать вывод и программно проверить это. У меня есть контроллер для каждого объекта Linq, который я использую для маршалинга объекта Linq, и у этого контроллера есть метод IsValid, который проходит и проверяет правила БД, используя технику, которую я видел здесь: http://www.codeproject.com/KB/cs/LinqColumnAttributeTricks.aspx

Я звоню по следующему коду:

        if (address.City.Length > Utilities.LinqValidate.GetLengthLimit(address, "City"))
            throw new ArgumentOutOfRangeException("address.City Max Length Exceeded");

Вот модифицированная версия утилиты, которую я использую:

    public static int GetLengthLimit(object obj, string field)
    {
        int dblenint = 0;   // default value = we can't determine the length

        Type type = obj.GetType();
        PropertyInfo prop = type.GetProperty(field);
        // Find the Linq 'Column' attribute
        // e.g. [Column(Storage="_FileName", DbType="NChar(256) NOT NULL", CanBeNull=false)]
        object[] info = prop.GetCustomAttributes(typeof(ColumnAttribute), true);
        // Assume there is just one
        if (info.Length == 1)
        {
            ColumnAttribute ca = (ColumnAttribute)info[0];
            string dbtype = ca.DbType;

            if (dbtype.StartsWith("NChar") || dbtype.StartsWith("NVarChar") ||
                dbtype.StartsWith("Char") || dbtype.StartsWith("VarChar")
                )
            {
                int index1 = dbtype.IndexOf("(");
                int index2 = dbtype.IndexOf(")");
                string dblen = dbtype.Substring(index1 + 1, index2 - index1 - 1);
                int.TryParse(dblen, out dblenint);
            }
        }
        return dblenint;
    }

    public static bool CanBeNull(object obj, string field)
    {
        bool canBeNull = false;

        Type type = obj.GetType();
        PropertyInfo prop = type.GetProperty(field); 
        object[] info = prop.GetCustomAttributes(typeof(ColumnAttribute), true); 
        if (info.Length == 1)
        {
            ColumnAttribute ca = (ColumnAttribute)info[0];
             canBeNull = ca.CanBeNull; 
        }
        return canBeNull;
    }
0 голосов
/ 08 сентября 2009

Я хотел бы добавить свой выбор, Adept SQLDiff , он может быть не таким гладким, как Redgate, но я нашел его более надежным (я оценил оба, хотя должен сказать, что это было несколько лет тому назад). У меня были бесплатные обновления в течение многих лет (поддерживается SQL Server 7 - 2008). За $ 320 с опцией Data Diff это очень хорошая цена (значительно дешевле, чем у Redgate). Разработчик отвечает на электронные письма лично и быстро. И нет, я на них не работаю, просто счастливый пользователь :)

0 голосов
/ 31 декабря 2008

Проверьте sysobjects и syscolumns (и sysindexes). Поскольку эти таблицы не меняются, вы можете написать LINQ, чтобы загрузить их и убедиться, что ваши ожидания оправданы. Или вместо этого вы можете сделать это в сценариях SQL.

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