Добавить или обновить данные в существующей базе данных с помощью структуры объекта - PullRequest
0 голосов
/ 06 февраля 2019

Я пытаюсь создать пользовательский шаг миграции, чтобы очистить некоторые значения по умолчанию в нашей базе данных.По сути, у нас есть некоторые данные, которые либо недействительны и должны быть обновлены, а в других случаях их вообще не существует.Система установлена ​​на нескольких серверах, и большая часть этих данных была добавлена ​​вручную в один момент, поэтому трудно определить, какой сервер имеет какие данные.

Я хочу создать шаг миграции, чтобы очистить все этовверх.Если это значение не существует в таблице, мне нужно вставить его.Однако, если он существует, я либо обновил его, либо просто удалил, а затем вставил.Мне трудно понять, как это сделать.

Add-Migration DataCleanup

Создать шаг миграции

public partial class DataCleanup : Migration
{
    protected override void Up(MigrationBuilder migrationBuilder)
    {
        migrationBuilder.InsertData(
            table: "Blogs",
            columns: new[] { "BlogId", "Url" },
            values: new object[] { 4, "http://sample4.com" });}

    protected override void Down(MigrationBuilder migrationBuilder)
    {
        migrationBuilder.DeleteData(
            table: "Blogs",
            keyColumn: "BlogId",
            keyValue: 4);
    }
}

Это будет работать, если строка не существовала ранее, но если строкасуществует, тогда мне нужно будет обновить, чтобы убедиться, что значение является правильным значением.Я не беспокоюсь о первичных ключах, так как это справочная таблица, они «должны» быть одинаковыми.

Единственный другой вариант, который я могу придумать, - это запустить усечение для этих таблиц, а затем просто запустить вставки после.

migrationBuilder.Sql("TRUNCATE TABLE [Blogs]", true);

Примечание вниз

Я склоняюсь к тому, что я вообще не в состоянии справиться.Там не будет никакого способа узнать, в каком состоянии этот сервер был до того, как я запустил это.

1 Ответ

0 голосов
/ 07 февраля 2019

Во-первых, я не смог сделать усечение для таблиц, были настроены внешние ключи, что означало, что это просто не сработало.

Я закончил делать кучу вставок SQL, которые проверяют сначаластроки существует, и если это не так, мы вставляем его.

migrationBuilder.Sql("INSERT INTO IdentityResources (Description, DisplayName, Emphasize, Enabled, Name, Required, ShowInDiscoveryDocument) " +
                                 "SELECT 'Your email address', 'User email', 1, 1, 'email', 0, 1 " +
                                 "WHERE NOT EXISTS(SELECT * " +
                                                  "FROM IdentityResources " +
                                                  "WHERE name = 'email'); ", true);

Когда мне нужно было добавить ключ из первой вставки, все стало немного сложнее.

migrationBuilder.Sql("INSERT INTO IdentityClaims (IdentityResourceId, Type) " +
                                         "SELECT id, 'email' " +
                                         "FROM IdentityResources " +
                                         "WHERE Name = 'email' " +
                                         "AND NOT EXISTS(SELECT * " +
                                         "FROM [IdentityClaims] " +
                                         "WHERE type = 'email')");

Все это сработало в конце.Новая установка системы создает правильную базу данных, и каждый обновляется, чтобы гарантировать, что у них есть по крайней мере необходимые данные.

К сожалению, удаление ненужных данных придется подождать еще один день.

...