Синхронизатор баз данных 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