我有一個資料庫遷移,我之前創建了許多遷移,現在我遇到了問題(架構不正確)。
最初的遷移創建了一個 SeriesRelation,它允許一個 Series 通過一些額外的元資料鏈接到另一個 Series(不是它本身)。目標是當我洗掉關系中的任何系列時,基礎系列不會洗掉。但是,由于這種疏忽,我最終無法洗掉任何具有 SeriesRelation 的系列,因為正在拋出 FK 約束,并且缺少 Cascade。
為了解決這個問題,我想將其更改FK_SeriesRelation_Series_SeriesId
為級聯洗掉,以便系列可以在洗掉時洗掉 SeriesRelation 行,但任何被洗掉的關系都不會洗掉源系列行。
我嘗試過自定義遷移,但不需要(通過 Rider 的資料庫工具檢查)。有任何想法嗎?
自定義遷移
migrationBuilder.DropForeignKey(
name: "FK_SeriesRelation_Series_SeriesId",
table: "SeriesRelation");
migrationBuilder.AddForeignKey(
name: "FK_SeriesRelation_Series_SeriesId",
table: "SeriesRelation",
column: "SeriesId",
principalTable: "Series",
principalColumn: "Id",
onDelete: ReferentialAction.Cascade);
原始遷移
migrationBuilder.CreateTable(
name: "SeriesRelation",
columns: table => new
{
Id = table.Column<int>(type: "INTEGER", nullable: false)
.Annotation("Sqlite:Autoincrement", true),
RelationKind = table.Column<int>(type: "INTEGER", nullable: false),
TargetSeriesId = table.Column<int>(type: "INTEGER", nullable: false),
SeriesId = table.Column<int>(type: "INTEGER", nullable: false)
},
constraints: table =>
{
table.PrimaryKey("PK_SeriesRelation", x => x.Id);
table.ForeignKey(
name: "FK_SeriesRelation_Series_SeriesId",
column: x => x.SeriesId,
principalTable: "Series",
principalColumn: "Id",
onDelete: ReferentialAction.Restrict);
table.ForeignKey(
name: "FK_SeriesRelation_Series_TargetSeriesId",
column: x => x.TargetSeriesId,
principalTable: "Series",
principalColumn: "Id",
onDelete: ReferentialAction.Cascade);
});
migrationBuilder.CreateIndex(
name: "IX_SeriesRelation_SeriesId",
table: "SeriesRelation",
column: "SeriesId");
migrationBuilder.CreateIndex(
name: "IX_SeriesRelation_TargetSeriesId",
table: "SeriesRelation",
column: "TargetSeriesId");
builder.Entity<SeriesRelation>()
.HasOne(pt => pt.Series)
.WithMany(p => p.Relations)
.HasForeignKey(pt => pt.SeriesId)
.OnDelete(DeleteBehavior.ClientCascade);
builder.Entity<SeriesRelation>()
.HasOne(pt => pt.TargetSeries)
.WithMany(t => t.RelationOf)
.HasForeignKey(pt => pt.TargetSeriesId);
如果它是相關的,有問題的類可以在這里找到:
系列:https ://github.com/Kareadita/Kavita/blob/develop/API/Entities/Series.cs
原始遷移:https ://github.com/Kareadita/Kavita/blob/develop/API/Data/Migrations/20220421214448_SeriesRelations.cs
編輯:流利的API:
builder.Entity<SeriesRelation>()
.HasOne(pt => pt.Series)
.WithMany(p => p.Relations)
.HasForeignKey(pt => pt.SeriesId)
.OnDelete(DeleteBehavior.ClientCascade);
builder.Entity<SeriesRelation>()
.HasOne(pt => pt.TargetSeries)
.WithMany(t => t.RelationOf)
.HasForeignKey(pt => pt.TargetSeriesId)
.OnDelete(DeleteBehavior.Cascade); // I added this OnDelete, but it doesn't work
uj5u.com熱心網友回復:
我想我解決了這個問題,但不是用 EF。我所做的是包含在 JOIN 中以拉回 Relation,所以當我執行洗掉時,級聯生效:
return await _context.Series
.Include(s => s.Volumes)
.Include(s => s.Metadata)
.ThenInclude(m => m.CollectionTags)
.Include(s => s.Relations)
.Where(s => seriesIds.Contains(s.Id))
.AsSplitQuery()
.ToListAsync();
我也把它放在我的 DataContext 中:
builder.Entity<SeriesRelation>()
.HasOne(pt => pt.Series)
.WithMany(p => p.Relations)
.HasForeignKey(pt => pt.SeriesId)
.OnDelete(DeleteBehavior.ClientCascade);
builder.Entity<SeriesRelation>()
.HasOne(pt => pt.TargetSeries)
.WithMany(t => t.RelationOf)
.HasForeignKey(pt => pt.TargetSeriesId)
.OnDelete(DeleteBehavior.ClientCascade);
這最終為我解決了。感謝那些評論并幫助我找到最終解決方案的人。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/507005.html