Сложные отношения SQL Server вызывают многокаскадный путь - PullRequest
0 голосов
/ 12 октября 2019

Мой файл миграции генерирует следующий сценарий sql:

CREATE TABLE [Provider] 
(
    [ProviderId] INT NOT NULL,
    [BusinessId] INT NULL,

    CONSTRAINT [FK_Provider_Business_BusinessId] 
        FOREIGN KEY ([BusinessId]) REFERENCES [Business] ([BusinessId]) 
                ON DELETE SET NULL,
    CONSTRAINT [FK_Provider_AspNetUsers_ProviderId] 
        FOREIGN KEY ([ProviderId]) REFERENCES [AspNetUsers] ([Id]) 
                ON DELETE CASCADE
);

Ошибка:

Введение ограничения FOREIGN KEY 'FK_Provider_AspNetUsers_ProviderId' для таблицы 'Provider' может вызывать циклы или множественный каскадпути. Укажите ON DELETE NO ACTION или ON UPDATE NO ACTION или измените другие ограничения FOREIGN KEY.

Не удалось создать ограничение или индекс. См. Предыдущие ошибки.

Я использую при удалении набор пустых значений в одном из столбцов, почему этого недостаточно?

Бизнес-таблица:

CREATE TABLE [Business] 
(
    [BusinessId] INT NOT NULL IDENTITY,
    [Name] NVARCHAR(100) NOT NULL,
    [OwnerId] INT NOT NULL,

    CONSTRAINT [PK_Business] PRIMARY KEY ([BusinessId]),
    CONSTRAINT [FK_Business_AspNetUsers_OwnerId] 
        FOREIGN KEY ([OwnerId]) REFERENCES [AspNetUsers] ([Id]) 
                ON DELETE CASCADE
);

Код миграции, который я использую в своем проекте asp:

  migrationBuilder.CreateTable(
        name: "Provider",
        columns: table => new
        {
            ProviderId = table.Column<int>(nullable: false),
            BusinessId = table.Column<int>(nullable: true)
        },
        constraints: table =>
        {
            table.PrimaryKey("PK_Provider", x => x.ProviderId);
            table.ForeignKey(
                name: "FK_Provider_Business_BusinessId",
                column: x => x.BusinessId,
                principalTable: "Business",
                principalColumn: "BusinessId",
                onDelete: ReferentialAction.SetNull);
            table.ForeignKey(
                name: "FK_Provider_AspNetUsers_ProviderId",
                column: x => x.ProviderId,
                principalTable: "AspNetUsers",
                principalColumn: "Id",
                onDelete: ReferentialAction.Cascade);
        });

1 Ответ

0 голосов
/ 12 октября 2019

Я использую при удалении набор пустых значений в одном из столбцов, почему этого недостаточно?

Потому что это все еще каскадное действие в базе данных. Вам нужно установить Restrict или NoAction (которые здесь в основном одинаковы).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...