Что я хочу:
-Если 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.