EF Core миграция существующих данных - PullRequest
0 голосов
/ 26 февраля 2019

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

Старая таблица: itemsInBag

ID
name
baglabel

Новые таблицы: item, itemsInBag, bag

item
Id
Name

itemsInBag
Id
ItemId
BagId

bag
Id
BagLabel

В настоящее время у меня есть эти операторы SQL, чтобы попытаться связать их вместе.Это делается после добавления новых таблиц и полей и до удаления полей itemsInBag. #

        migrationBuilder.Sql(
            "INSERT INTO items (Name)" +
            "SELECT (name) FROM itemsInBag");

        migrationBuilder.Sql(
            "INSERT INTO bag baglabel" +
            "SELECT DISTINCT baglabel FROM itemsInBag");

        migrationBuilder.Sql(
            "UPDATE itemsInBag SET bagid =(SELECT id FROM bag WHERE bag.baglabel = itemsInBag.baglabel)"
        );

        migrationBuilder.Sql(
            "UPDATE itemsInBag SET itemid =(SELECT id FROM items WHERE items.name = itemsInBag.name)"
        );

Я получаю эту ошибку при попытке запустить миграцию

$exception  {"23505: could not create unique index \"IX_itemsinbag_bagid_itemid\""} Npgsql.PostgresException

"Key (bagid, itemid)=(0, 0) is duplicated."

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

ОБНОВЛЕНИЕ: если я перенесу уникальное ограничение на bagid и itemid после операторов SQL, я получу эту ошибку

$exception  {"23503: insert or update on table \"itemsinbag\" violates foreign key constraint \"FK_itemsinbag_bag_bagid\""} Npgsql.PostgresException
"Key (bagid)=(0) is not present in table \"bag\"

1 Ответ

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

Разобрался с решением этой проблемы.Все дело было в том, чтобы определить, где были индексы и ограничения внешнего ключа по отношению к моим операторам SQL.Ограничения внешнего ключа необходимо было создать после перестановки данных таблиц.Была также ошибка после того, как таблица элементов не существовала на вставке.Схему необходимо было включить так, чтобы окончательные операторы SQL были следующими:

migrationBuilder.Sql(
        "INSERT INTO schema.items (Name)" +
        "SELECT name FROM schema.itemsInBag");

    migrationBuilder.Sql(
        "INSERT INTO schema.bag (baglabel)" +
        "SELECT DISTINCT baglabel FROM schema.itemsInBag");

    migrationBuilder.Sql(
        "UPDATE schema.itemsInBag SET bagid =(SELECT id FROM schema.bag WHERE schema.bag.baglabel = schema.itemsInBag.baglabel)"
    );

    migrationBuilder.Sql(
        "UPDATE schema.itemsInBag SET itemid =(SELECT id FROM schema.items WHERE schema.items.name = schema.itemsInBag.name)"
    );
...