Представляем вашему вниманию DbTool — утилиту командной строки для экспорта данных БД в различные форматы и open-source библиотеку Korzh.DbUtils, использование которых может значительно упростить первоначальное "засевание" базы данных в вашем .NET (Core) приложении. С помощью этого набора инструментов вы сможете: Ниже я расскажу зачем все это нужно, как проинсталлировать и настроить данные инструменты и опишу детальный сценарий их использования.   Первоначальной задачей было создание удобного механизма наполнения БД в .NET (Core) приложениях. В силу специфики нашего рода деятельности (разработка компонент) нам часто приходится создавать небольшие приложения-примеры, которые демонстрируют ту или иную особенность нашего продукта. Такие демо-проекты должны работать с некой тестовой базой данных и поэтому желательно автоматически создать и наполнить эту БД при первом старте приложения. Если в проекте используется Entity Framework (Core) (а так оно чаще всего и бывает), то с созданием базы никаких проблем нет. Вы просто вызываете dbContext.Database.EnsureCreated или dbContext.Database.Migrate (если важно сохранить миграции). А вот с наполнением базы данными все немного сложнее. Первое, что приходит в голову, это просто создать SQL скрипт с кучей INSERT'ов, положить его в проект и выполнять при первом запуске. Это работает (и долгое время мы так и делали), но с таким подходом есть некоторые проблемы. В первую очередь — вопрос синтаксиса SQL под конкретную СУБД. Довольно часто исходная СУБД отличается от той, которая реально используется у пользователя и наш SQL скрипт может не срабатывать. Вторая возможная проблема — это миграции самой базы. Периодически возникает необходимость немного поменять структуру БД (добавить новое поле, удалить или переименовать старое, добавить новую связь между таблицами и т.д.). SQL script созданный под старую структуру обычно становится в этом случае нерелевантен и его выполнение вызывает ошибку. В то время, как загрузка данных из некоторого стороннего формата проходит без проблем. Новые/измененные поля просто пропускаются. Согласитесь, что в целях демонстрации лучше чтобы программа запустилась, хоть и без данных в каком-то новом поле, нежели чтобы не запустилась совсем. В результате мы пришли к следующему решению: DbTool реализована как .NET Core global tool т.е. может быть легко установлена на любую систему где есть .NET SDK верcии 2.1 или выше. Для инсталляции утилиты нужно просто открыть консоль (Terminal / Command Prompt) и запустить такую команду: Для проверки после установки наберите в консоли dbtool и вы увидите справку со списком доступных команд.  Чтобы начать работать с DbTool нужно добавить соединение с базой данных: Здесь: Пример:  После этого вы можете проверить все ваши соединения, набрав: Теперь, когда мы добавили соединение, мы можем экспортировать нашу базу данных с помощью команды export: Любая опция, указанная выше, может быть опущена. Если не указывать format то будет использоваться JSON. Если опустить опцию output, то результат будет помещен в каталог вида ConnectionId_yyyy-MM-dd в незапакованном виде. Например, следующая команда: создаст ZIP-архив с именем MyDbData.zip в текущем каталоге и заполнит его файлами данных в формате JSON (по одному файлу на каждую таблицу БД).  Вы можете импортировать данные, созданные на предыдущем шаге, обратно в вашу БД. Или в любую другую базу с такой же структурой. Сама команда импорта выглядит следующим образом: Опция --input указывает утилите где искать импортируемые данные. Если указан путь к папке, DbTool будет импортировать .xml или .json файлы в этой папке. Если же это ZIP-файл, то утилита сначала распакует этот архив и оттуда заберет необходимые файлы с данными. Как и в предыдущем случае --format может быть опущена так как DbTool может распознавать формат по расширениям файлов. Пример: Сама утилита DbTool построена на основе open-source библиотеки Korzh.DbUtils, которая включает в себя несколько пакетов с реализацией некоторых базовых операций над базами данных. Определяет основные абстракции и интерфейсы, такие как IDatasetExporter, IDatasetImporter, IDataPacker, IDbBridge Содержит реализации интерфейсов IDatasetImporter для форматов XML и JSON. Кроме того, этот пакет включает класс DbInitializer, который можно использовать для заполнения данных в ваших проектах (подробнее об этом ниже). Содержит реализации IDatasetExporter для XML и JSON. Содержит реализацию интерфейсов основных операций с БД (IDbBridge, IDbReader, IDbSeeder) для MS SQL Server. Содержит реализации интерфейсов по работе с БД для MySQL. Здесь вы можете найти полный справочник по API библиотеки Korzh.DbUtils. Теперь, собственно рассмотрим как с помощью DbTool и Korzh.DbUtils реализовать базовый сценарий наполнения (seeding) БД при первом запуске приложения. Предположим, у вас есть «мастер-копия» некоторой БД, которую необходимо "скопировать" на компьютере пользователя при первом запуске приложения. Просто устанавливаем DbTool, как описано выше, добавляем соединение с БД и запускаем команду экспорта, чтобы сохранить все данные из этой БД в отдельную папку: После предыдущего шага у нас есть новая папка, вида MyMasterDb-yyyy-MM-dd, с кучей JSON файлов (по одному для каждой таблицы). Просто копируем содержимое этой папки в App_Data\DbSeed нашего .NET (Core) проекта. Обратите внимание, что для проектов под .NET Framework вам также нужно будет "вручную" добавить эти файлы в проект. Хотя сам процесс (с точностью до некоторых деталей) применим для любого типа проекта под .NET Core или .NET Framework (версии 4.6.1 или выше), для простоты описания предположим, что речь идет про проект ASP.NET Core, который работает с базой данных SQL Server и что эта база создается автоматически, с помощью Entity Framework Core. Таким образом для решения задачи заполнения БД данными при первом запуске нам нужно: В этом случае нам понадобится 2 из них: Вот пример такого кода, который мы должны добавить в конце метода Startup.Configure: Чтобы сделать уж совсем все красиво или если надо выполнить некоторую дополнительную инициализацию при первом запуске (например, добавить несколько учетных записей и/или ролей пользователей), то лучше оформить весь этот код в виде отдельного extension method'а (назовем его EnsureDbInitialized) для интерфейса IApplicationBuilder. Пример такой реализации можно найти на GitHub в демо проекте для библиотеки EasyQuery. В этом случае вам просто нужно добавить один вызов в конце вашего метода Startup.Configure: Хотя библиотека и утилита были написаны под вполне определенный сценарий, мы старались сделать все как можно более гибко и расширяемо поэтому включить дополнительный функционал не составит особых проблем. Из возможных улучшений мы видим следующие: Поддержка других баз данных (PostgreSQL, Oracle, SQLite, MariaDB) Новые форматы в которые можно экспортировать данные (CSV, Excel, HTML) Операция непосредственного копирования данных из БД в БД (сейчас можно реализовать через пару последовательных вызовов команд export/import) Полноценные операции backup / restore с полным сохранением структуры БД и созданием ее "с нуля" при восстановлении. Будем рады услышать любые пожелания или замечания и очень благодарны за новые звездочки для GitHub репозитория библиотеки :) Спасибо за внимание! .NET разработчик, предприниматель