Entity Framework Core 2.1: ограничение внешнего ключа вызывает циклические / множественные каскадные пути - PullRequest
0 голосов
/ 25 сентября 2018

Что я хочу:

-Если FeedGroup удалено, то связанные с ним FeedGroupStatuses и BinFeedGroupStatuses будут удалены.

-Если a FeedGroupStatus удаляется, связанные BinFeedGroupStatuses удаляются, но связанные FeedGroup не удаляются.

-Если BinFeedGroupStatus удаляется, ни один из связанных объектов не удаляется, только отношение.


Что у меня есть:

-Если FeedGroup удалено, столбец FeedGroupId FeedGroupStatus устанавливается на NULL

-Если FeedGroupStatus удалено, то связанное BinFeedGroupStatus удаляется


Как я к нему подошел:

Я предположил, что моей ошибкой было то, что у меня было FeedGroupId свойство FeedGroupStatus как int? вместо int.Поэтому я изменил это, сделал add-migration, но когда я попытался обновить базу данных, я получил следующую ошибку

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


Мой вопрос:

У меня есть общее понимание(из здесь ), что вызывает вышеуказанную ошибку, но я не знаю, где в моем коде возникает проблема.Справка?


Модели

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

    public ICollection<FeedGroupStatus> FeedGroupStatuses { get; set; }

    //and other unrelated properties
}

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

    public int FeedGroupId { get; set; }  //<-- was nullable
    public FeedGroup FeedGroup { get; set; }

    public ICollection<BinFeedGroupStatus> BinFeedGroupStatuses { get; set; }

    //and other unrelated properties
}

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

    public int FeedGroupStatusId { get; set; }
    public FeedGroupStatus FeedGroupStatus { get; set; }
}


DataContext

public class DataContext : DbContext
{
    public DataContext(DbContextOptions<DataContext> options) : base(options)
    {
    }

    public DbSet<FeedGroup> FeedGroups { get; set; }
    public DbSet<BinFeedGroupStatus> BinFeedGroupStatuses { get; set; }
    public DbSet<FeedGroupStatus> FeedGroupStatuses { get; set; }

    protected override void OnModelCreating(ModelBuilder builder)
    {
        builder.Entity<BinFeedGroupStatus>()
            .HasKey(fgs => new {fgs.FeedGroupStatusId, fgs.BinId});

        builder.Entity<BinFeedGroupStatus>()
            .HasOne(bfgs => bfgs.FeedGroupStatus)
            .WithMany(fgs => fgs.BinFeedGroupStatuses)
            .HasForeignKey(fgs => fgs.FeedGroupStatusId)
            .OnDelete(DeleteBehavior.Cascade);

        builder.Entity<BinFeedGroupStatus>()
            .HasOne(bfgs => bfgs.Bin)
            .WithMany(b => b.BinFeedGroupStatuses)
            .HasForeignKey(fgs => fgs.BinId)
            .OnDelete(DeleteBehavior.Cascade);
    }
}


Миграция

public partial class changedNullableFKs : Migration
{
    protected override void Up(MigrationBuilder migrationBuilder)
    {
        migrationBuilder.DropForeignKey(
            name: "FK_FeedGroupStatuses_FeedGroups_FeedGroupId",
            table: "FeedGroupStatuses");

        migrationBuilder.AlterColumn<int>(
            name: "FeedGroupId",
            table: "FeedGroupStatuses",
            nullable: false,
            oldClrType: typeof(int),
            oldNullable: true);

        migrationBuilder.AddForeignKey(
            name: "FK_FeedGroupStatuses_FeedGroups_FeedGroupId",
            table: "FeedGroupStatuses",
            column: "FeedGroupId",
            principalTable: "FeedGroups",
            principalColumn: "Id",
            onDelete: ReferentialAction.Cascade);
    }
    //...
}


Определения

FeedGroup: группа скота
FeedGroupStatus: численность этого FeedGroup и какие бины онивы едите в течение определенного периода времени.
BinFeedGroupStatus: связь между корзинами новостей и состояниями FeedGroup.

...