Entity Framework Core 2.1: OnDelete Cascade - несколько каскадных путей - PullRequest
0 голосов
/ 05 октября 2018

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

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

Похоже, ошибка возникает в тех местах, где у меня есть несколько отношений «один ко многим» для объекта.

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


Пример 1

Классы
public class Bin
{
    public int Id { get; set; }

    public int BarnId { get; set; }
    public Barn Barn { get; set; }

    public int GatewayId { get; set; }
    public Gateway Gateway { get; set; }
}

public class Barn
{
    public int Id { get; set; }
    public ICollection<Bin> Bins { get; set; }
}

public class Gateway
{
    public int Id { get; set; }
    public ICollection<Bin> Bins { get; set; }
}


Миграция

migrationBuilder.CreateTable(
    name: "Bins",
    columns: table => new
    {
        Id = table.Column<int>(nullable: false)
            .Annotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn)
        BarnId = table.Column<int>(nullable: false),
        GatewayId = table.Column<int>(nullable: false)
    },
    constraints: table =>
    {
        table.PrimaryKey("PK_Bins", x => x.Id);
        table.ForeignKey(
            name: "FK_Bins_Barns_BarnId",
            column: x => x.BarnId,
            principalTable: "Barns",
            principalColumn: "Id",
            onDelete: ReferentialAction.Cascade);
        table.ForeignKey(
            name: "FK_Bins_Gateways_GatewayId",
            column: x => x.GatewayId,
            principalTable: "Gateways",
            principalColumn: "Id",
            onDelete: ReferentialAction.Cascade);
     });

Ошибка возникает при попытке создать "FK_Bins_Gateways_GatewayId"

Требуемая функциональность: при удалении Barn соответствующие Bins удаляются.Когда Gateway удален, связанные Bins являются не удаленными


Пример 2

Классы
public class Bin
{
    public int Id { get; set; }

    public ICollection<BinFeed> BinFeeds { get; set;}
}

public class Feed
{
    public int Id { get; set; }

    public ICollection<BinFeed> BinFeeds { get; set;}
}

public class BinFeed
{
    public int Id { get; set; }

    public bool Current { get; set;}

    public int BinId { get; set; }
    public Bin Bin { get; set; }

    public int FeedId { get; set; }
    public Feed Feed { get; set; }
}


Миграция

migrationBuilder.CreateTable(
            name: "BinFeeds",
            columns: table => new
            {
                Id = table.Column<int>(nullable: false)
                    .Annotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn),
        BinId = table.Column<int>(nullable: false),
        FeedId = table.Column<int>(nullable: false),
        Current = table.Column<bool>(nullable: false)
        },
        constraints: table =>
        {
            table.PrimaryKey("PK_BinFeeds", x => x.Id);
            table.ForeignKey(
            name: "FK_BinFeeds_Bins_BinId",
            column: x => x.BinId,
            principalTable: "Bins",
            principalColumn: "Id",
            onDelete: ReferentialAction.Cascade);
        table.ForeignKey(
            name: "FK_BinFeeds_Feeds_FeedId",
            column: x => x.FeedId,
            principalTable: "Feeds",
            principalColumn: "Id",
            onDelete: ReferentialAction.Cascade);
    });

Ошибка возникает при попытке создать "FK_BinFeeds_Feeds_FeedId"

Требуемая функциональность:Когда Bin удаляется, связанные BinFeeds удаляются.При удалении Feed связанные BinFeeds удаляются.

1 Ответ

0 голосов
/ 09 октября 2018

У меня была похожая проблема в прошлом.Я выяснил, что если вы не настроите OnModelCreating вручную, он автоматически найдет взаимосвязь, и у вас не возникнет проблем (возможно, он делает то же самое в варианте 2).Также вы можете установить onDelete: ReferentialAction.NoAction , если вы не собираетесь удалять какие-либо данные из таблиц в этом отношении в будущем.Другое решение - использовать триггеры со сторонним пакетом или путем ручной настройки с помощью SQL.

...