Синхронизатор баз данных LINQ to SQL

Основные преимущества

  • Синхронизация моделей при помощи одного нажатия
  • Лучшая производительность команды, ускоренные изменения в базах данных между вашими членами команд
  • Более легкие установки и обновления продуктов, не требующие сложных SQL-скриптов
  • Более простая поддержка одной модели вместо двух

Основы

LINQ to SQL Framework предоставляет простой и удобный способ сообщения между базами данных, используя простые классы C# и LINQ, без необходимости в написании сложных SQL-команд. При работе с данной структурой вы можете заметить один большой недостаток: метод DataContext.CreateDatabase поддерживает только создание новых баз данных. Это означает, что для того, чтобы модифицировать существующую модель LINQ to SQL по отношению к существующей базе данных, вы сначала должны применить структурные изменения вручную по отношению к базе данных, или же удалить базу данных полностью, и затем заново вызвать метод CreateDatabase. Этот недостаток по-настоящему может замедлить вашу команду, когда каждый ее член обладает своей собственной базой данных. И в том случае, если кто-то хочет добавить что-либо, что требует изменений в базе данных, то каждому члену придется запустить различные скрипты и выполнить изменения вручную в своих базах данных. То же самое будет и с серверами, которые должны быть обновлены с новой версией продукта.

Метод DataContext.CreateDatabase , который мы ранее упоминали, использует SQL-скрипты для создания базы данных и таблиц в ней. Данный инструмент использует вместо этого библиотеку объектов управления сервером SQL Server Management Objects (SMO). Она анализирует модель LINQ to SQL, сравнивает ее с существующей структурой базы данных и наконец применяет все необходимые изменения к структуре базы данных.

Код

У нас фактически две модели, которые мы хотим синхронизировать - одна является моделью LINQ to SQL, а другая - моделью базы данных. Теперь, давайте начнем с загрузки модели LINQ to SQL:

var asm = Assembly.LoadFrom(Options.AssemblyFile);       //загрузка файла сборки
var type = asm.GetType(Options.TypeName, true);          //нахождение класса DataContext
                          //использование отражения
var model = new AttributeMappingSource().GetModel(type); //загрузка LINQ to SQL модели
                                                         //из указанного типа

Это можно просмотреть в онлайн версии интегрированной среды разработки здесь и здесь.

Теперь мы загрузим модель базы данных используя SMO и строку соединения.

var sb = new SqlConnectionStringBuilder(ConnectionString);   //анализ строки соединения  var server = new Server(sb.DataSource);                      //соединение с сервером баз данных var db = server.Databases[sb.InitialCatalog];                //получение базы данных

Это можно просмотреть в онлайн версии интегрированной среды разработки здесь и здесь.

Теперь у нас есть все необходимые данные, и все заключается в итерации модели LINQ to SQL и нахождении соответствующих объектов баз данных. Если они не существуют, то мы просто создаем их, в противном случае мы проверяем их объявление.

foreach (MetaTable table4 in model.GetTables())
{
  string schemaName;
  string tableName;
  ParseFullTableName(mt.TableName, out schemaName, out tableName);  //разделение схемы и названия таблицы
  var table = Database.Tables[tableName, schemaName];               //нахождение таблицы
  if (table == null)                                                //если таблица
                                                                    //не существует  
  {
    table = new Table(Database, tableName, schemaName);             //создаем таблицу
    Database.Tables.Add(table);
  }
  //теперь мы можем синхронизировать колонки таблицы...
}

Это можно просмотреть в онлайн версии интегрированной среды разработки здесь и здесь.

Использование кода

Данный инструмент работает в качестве простого инструмента командной строки (*.exe). Всего лишь укажите сборку, напишите название класса LINQ to SQL DataContext и запустите - структура вашей базы данных будет синхронизирована данной моделью.

Условия

Данный инструмент использует объекты SQL Server Management Objects (SMO), и последняя версия может быть найдена на странице загрузки Microsoft SQL Server 2008 Feature Pack, но вот также и прямые ссылки:

Использование

Данный инструмент используется как любой инструмент командной строки при помощи следующего синтаксиса:

csdb.exe /assembly:[AssemblyFile] /type:[TypeName] /autocreate 
    /autoupdate /cs:[ConnectionString] /dbfilename:[DatabaseFilename]
    
  /assembly:[AssemblyFile]    The assembly filename that contains the LINQ to SQL
               (http://msdn.microsoft.com/en-us/library/bb425822.aspx)
               DataContext class, e.g.: bin\debug\MyApp.exe
  /type:[TypeName]            Optional, The type name of the LINQ to SQL
               (http://msdn.microsoft.com/en-us/library/bb425822.aspx)
               DataContext class, e.g.: MyApp.MyDataContext.
               if not provided,
               any class that inherits from the DataContext
               class will be processed.
  /autocreate                 When specified, the tool will create the database
               if it doesn't exist.
  /autoupdate                 When specified, the tool will update the existing
               database structure.
  /cs:[ConnectionString]      Optional, The connection string of the database
               to be synchronized, if not provided, the default
               connection string will be used if it exists
               in your settings.
  @[Arguments Filename]       Read the command line arguments from an
               external text file

Пример

Данное выражение синхронизирует (создаст и обновит) базу данных MyDb в экземпляре SqlExpress локальной станции используя класс MyApp.MyDataContext, расположенный в сборке MyApp.exe.

csdb.exe /assembly:"bin\debug\MyApp.exe" /type:"MyApp.MyDataContext" 
    /autocreate /autoupdate /cs:"Data Source=.\SQLEXPRESS;Initial
    Catalog=MyDb;Integrated Security=True"

Рекомендации

  • Указывайте обе опции /autocreate и /autoupdate для наибольшей автоматизации.
  • Создайте командный файл, который запускает данный инструмент и включите его в ваш проект.
  • На ранних этапах разработки запускайте данный командный файл после каждого шага разработки для ускорения процесса.

Запуск примера

Исходный код включает в себя пример проекта с моделью LINQ to SQL хорошо известной базы данных Northwind. Для запуска примера:

  • Установите - SQLSysClrTypes.msi, SharedManagementObjects.msi
  • Откройте решение и осуществите его сборку
  • Запустите командный файл Samples\SyncMyNorthwindDb.bat для создания базы данных
  • Запустите проект Samples

Для изменения модели LINQ to SQL и синхронизации базы данных:

  • Измените модель LINQ to SQL посредством изменения файла MyNorthwind.dbml при помощи Visual Studio, вы можете добавить колонку, добавить таблицу, изменить тип данных колонки, позволить колонке принимать значения типа null и т.д....
  • Осуществите сборку проекта Samples для отражения ваших изменений.
  • Запустите командный файл SyncMyNorthwindDb.bat для синхронизации вашей базы данных.

Напоследок

Нам кажется данный инструмент удовлетворяет все нужды при использовании LINQ to SQL Framework. Он широко используется в CodeRun как при разработке, так и при вводе в действие. Таким образом модификация базы данных так же проста, как добавление свойства.

Автор: Dan-el Khen