Можем ли мы запустить скрипт SQL, используя код первой миграции?
Можем ли мы запустить скрипт sql, используя код первой миграции?
Сначала я новичок в коде, и если я хочу сохранить свои изменения в файле сценария SQL перед командой переноса update-database, возможно ли это?
Если возможно, пожалуйста, предоставьте шаги, чтобы сделать это. Кроме того, если сценарий сгенерирован, то возможно ли запустить этот сценарий с помощью миграции?
Ответы
Ответ 1
Сначала вам нужно создать миграцию.
Add-Migration RunSqlScript
Затем в сгенерированном файле миграции вы можете написать свой SQL.
// PLAIN SQL
Sql("UPDATE dbo.Table SET Created = GETDATE()");
// FROM FILE
var sqlFile = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, @"Custom.sql");
Sql(File.ReadAllText(sqlFile));
Затем вы запустите
Update-Database
Ответ 2
Что мне нравится делать, так это вставлять скрипт SQL как ресурс в сборку и использовать метод SqlResource
. Я протестировал этот подход с Visual Studio 2017 15.5.6.
Сначала вам нужно создать файл миграции:
- В Visual Studio обязательно установите в качестве начального проекта проект, в котором определен ваш
DbContext
- В Visual Studio откройте PMC: Вид → Другие окна → Консоль диспетчера пакетов.
- В PMC Установите проект по умолчанию для проекта, который содержит DbContext
-
Если у вас установлено ядро EF и EF 6.x:
EntityFramework\Add-Migration RunSqlScript
-
Если у вас установлен только EF 6.x:
Add-Migration RunSqlScript
Добавьте Sql Script в папку миграции (я называю его тем же префиксом, что и файл миграции)
![Migration folder in the Solution Explorer]()
В окне "Свойства файла" убедитесь, что действие "Построение" имеет значение "Встроенный ресурс". Обратите внимание, что нам не нужно копировать в выходную папку, поскольку сценарий sql будет встроен в сборку.
Обновите метод Up в миграции RunSqlScript
public override void Up()
{
string sqlResName = typeof(RunSqlScript).Namespace + ".201801310940543_RunSqlScript.sql";
this.SqlResource(sqlResName );
}
надеюсь, это поможет
Ответ 3
Подобно SQL, у нас есть другой метод SqlFile. вы можете напрямую использовать это.
Ответ 4
Для .NET Core и EF Core вы можете сделать что-то подобное в процессе миграции
protected override void Up(MigrationBuilder migrationBuilder)
{
var schema = "starter_core";
migrationBuilder.Sql($"INSERT INTO [{schema}].[Roles] ([Name]) VALUES ('transporter')");
}