EF Core - исходные данные - нарушение PK

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

У меня есть проблема в том, что у нас есть существующая база данных, в которой некоторые таблицы, в которых исходные данные должны были быть выполнены с помощью migrationBuilder, выглядят только что вставленными с помощью сценариев SSMS \ SQL Server Insert.

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

Нарушение ограничения PRIMARY KEY PK_xxxx. Невозможно вставить повторяющийся ключ в объект forms.AnswerTypes. Повторяющееся значение ключа: (1)

Единственный потенциальный способ, который я нашел, - это ссылка здесь

https://entityframeworkcore.com/knowledge-base/54553668/add-or-update-data-to-existing-database-with-entity-framework

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

Пример данных, которые я пытаюсь заполнить, выглядит следующим образом;

protected override void Up(MigrationBuilder migrationBuilder)
{
    migrationBuilder.InsertData(
        schema: "forms",
        table: "Rules",
        columns: new[] { "RuleId", "Rules" },
        values: new object[] { 1, "Any" });

    migrationBuilder.InsertData(
        schema: "forms",
        table: "Rules",
        columns: new[] { "RuleId", "Rules" },
        values: new object[] { 2, "All" });
}

Итак, вопрос в том, можно ли с помощью migrationBuilder проверить, существуют ли данные до их вставки?


person Simon Price    schedule 14.05.2020    source источник


Ответы (1)


Вы можете написать собственный SQL и прочее и добавить его в свой сценарий миграции;

https://docs.microsoft.com/en-us/ef/core/managing-schemas/migrations/operations

Также есть .Sql():

https://docs.microsoft.com/en-us/ef/core/managing-schemas/migrations/?tabs=dotnet-core-cli#customize-migration-code.

migrationBuilder.Sql(
@"
    UPDATE Customer
    SET Name = FirstName + ' ' + LastName;
");

Что вы могли бы использовать. Моя команда и я все еще используем EF6, но по тому же принципу. В нашем сценарии миграции иногда есть дополнительные операторы SQL для перемещения любых данных или генерации данных по умолчанию при добавлении столбца и т. Д.

person sommmen    schedule 14.05.2020
comment
Это то, что я думал, основываясь на ссылке в вопросе. Надеюсь, проблема не возникнет в ближайшее время, поскольку похоже, что мы сначала уходим от кода. - person Simon Price; 14.05.2020