Инструмент LINQ to SQL Database Synchronizer (csdb.exe) предоставляет синхронизацию структур баз данных из модели . Он поддерживает как создание новых баз данных,так и обновление существующих. Важно заметить то, что данный инструмент никогда не удаляет данные или структуру - он просто добавляет отсутствующие таблицы, колонки и индексы, а также модифицирует существующие колонки.
Основные преимущества
Синхронизация моделей при помощи одного нажатия
Лучшая производительность команды, ускоренные изменения в базах данных между вашими членами команд
Более легкие установки и обновления продуктов, не требующие сложных SQL-скриптов
Более простая поддержка одной модели вместо двух
Основы
Framework предоставляет простой и удобный способ сообщения между базами данных, используя простые классы C# и LINQ, без необходимости в написании сложных SQL-команд. При работе с данной структурой вы можете заметить один большой недостаток: метод DataContext.CreateDatabase поддерживает только создание новых баз данных. Это означает, что для того, чтобы модифицировать существующую модель по отношению к существующей базе данных, вы сначала должны применить структурные изменения вручную по отношению к базе данных, или же удалить базу данных полностью, и затем заново вызвать метод CreateDatabase. Этот недостаток по-настоящему может замедлить вашу команду, когда каждый ее член обладает своей собственной базой данных. И в том случае, если кто-то хочет добавить что-либо, что требует изменений в базе данных, то каждому члену придется запустить различные скрипты и выполнить изменения вручную в своих базах данных. То же самое будет и с серверами, которые должны быть обновлены с новой версией продукта.
Метод DataContext.CreateDatabase , который мы ранее упоминали, использует 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 и запустите - структура вашей базы данных будет синхронизирована данной моделью.
Условия
Данный инструмент использует объекты , и последняя версия может быть найдена на странице загрузки , но вот также и прямые ссылки:
Использование
Данный инструмент используется как любой инструмент командной строки при помощи следующего синтаксиса:
/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.
Указывайте обе опции /autocreate и /autoupdate для наибольшей автоматизации.
Создайте командный файл, который запускает данный инструмент и включите его в ваш проект.
На ранних этапах разработки запускайте данный командный файл после каждого шага разработки для ускорения процесса.
Запуск примера
Исходный код включает в себя пример проекта с моделью LINQ to SQL хорошо известной базы данных Northwind. Для запуска примера:
Установите - ,
Откройте решение и осуществите его сборку
Запустите командный файл Samples\SyncMyNorthwindDb.bat для создания базы данных
Запустите проект Samples
Для изменения модели LINQ to SQL и синхронизации базы данных:
Измените модель LINQ to SQL посредством изменения файла MyNorthwind.dbml при помощи Visual Studio, вы можете добавить колонку, добавить таблицу, изменить тип данных колонки, позволить колонке принимать значения типа null и т.д....
Осуществите сборку проекта Samples для отражения ваших изменений.
Запустите командный файл SyncMyNorthwindDb.bat для синхронизации вашей базы данных.
Напоследок
Нам кажется данный инструмент удовлетворяет все нужды при использовании Framework. Он широко используется в как при разработке, так и при вводе в действие. Таким образом модификация базы данных так же проста, как добавление свойства.
LINQ,
Библиотека LINQ to CSV Простая в использовании библиотека для использования CSV и файлов с разделителями табуляции с запросами LINQ....
LINQ,
Привязка ElementName в Silverlight посредством прикрепленных поведений Если вы новичок и не знакомы Silverlight, то вам все же может показаться все не таким сложным, когда вы начнете разработку. Удивительно легко выполнить переход от WPF к Silverlight, при этом большинство основных принципов будут такими же. Тем не менее, существуют некоторые части WPF-структуры, которые вам будет не хватать. Одной из них является привязка ElementName....
LINQ,
LINQ to SQL - отношения «многие ко многим» Отношение "многие ко многим" является двунаправленным между двумя сущностями, разрешенное посредством перекрестной таблицы с отношением типа "один ко многим" к каждой из сущностей. Большинство разработчиков считают отношение "многие ко многим" нестандартным для моделирования баз данных. Тем не менее, LINQ to SQL не предоставляет поддержку данных типов отношений, а PLINQO позволяет простоту в работе с такими отношениями. Мы ...
LINQ,
LINQ to SQL - отделение сущностей при помощи Detach Как же использовать разъединённые сущности с LINQ to SQL? Каждый разработчик, который использует LINQ to SQL, задавался таким вопросом. Где же их разъединить? Как же использовать данные сущности с сервисами, JSON, инкапсуляцией и в контексте многокомпонентных данных? Все они являются здравыми вопросами при составлении структуры. По умолчанию, LINQ to SQL не торопится разъединять данные сущности и не видит причины, почему они должны быть отделены от его контекста.
Место под правое меню