Entity Framework Core 2.1: OnDelete Cascade - несколько каскадных путей

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

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

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

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


Пример 1

Classes

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

Classes

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 удаляются.


person JED    schedule 05.10.2018    source источник


Ответы (1)


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

person brainoverflow98    schedule 09.10.2018