На первый взгляд, мне действительно нравится подход Carl G, но он требует много ручного взаимодействия В моем сценарии я всегда отбрасываю все хранимые процедуры, представления ... и воссоздаю их всякий раз, когда происходит изменение в базе данных. Таким образом, мы уверены, что все обновлено до последней версии.
Восстановление происходит путем установки следующего инициализатора:
Database.SetInitializer(new MigrateDatabaseToLatestVersion<MyContext, Configuration>());
Тогда наш начальный метод будет вызываться всякий раз, когда будет готова миграция.
protected override void Seed(DeploymentLoggingContext context)
{
// Delete all stored procs, views
foreach (var file in Directory.GetFiles(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Sql\\Seed"), "*.sql"))
{
context.Database.ExecuteSqlCommand(File.ReadAllText(file), new object[0]);
}
// Add Stored Procedures
foreach (var file in Directory.GetFiles(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Sql\\StoredProcs"), "*.sql"))
{
context.Database.ExecuteSqlCommand(File.ReadAllText(file), new object[0]);
}
}
Заявления SQL хранятся в * .sql файлах для удобного редактирования. Убедитесь, что в ваших файлах «Build Action» установлено «Content», а «Copy to Output Directory» установлено в «Copy Always». Мы ищем папки и выполняем все скрипты внутри. Не забудьте исключить операторы «GO» в вашем SQL, потому что они не могут быть выполнены с помощью ExecuteSqlCommand ().
Моя текущая структура каталогов выглядит следующим образом:
Project.DAL
+ Миграции
+ Sql
++ Семя
+++ dbo.cleanDb.sql
++ StoredProcs
+++ dbo.sp_GetSomething.sql
Теперь вам просто нужно добавить дополнительные хранимые процедуры в папку, и все будет обновлено соответствующим образом.