在表“Posts”上引入 FOREIGN KEY 約束“FK_Posts_Posts_RepostId”可能會導致回圈或多個級聯路徑。指定 ON DELETE NO ACTION 或 ON UPDATE NO ACTION,或修改其他 FOREIGN KEY 約束。
嘗試 1
public class Post
{
public int Id { get; set; }
public string Text { get; set; }
public int? RepostId { get; set; }
public Post Repost { get; set; }
}
流暢的 API
builder.Entity<Post>()
.HasOne(s => s.Repost)
.WithOne()
.OnDelete(DeleteBehavior.SetNull);
嘗試 2
https://stackoverflow.com/a/53678583/13434418
public class Repost
{
public Repost()
{
Posts = new HashSet<Post>();
}
public int Id { get; set; }
public int? PostId { get; set; }
public virtual Post? Post { get; set; }
public virtual ICollection<Post> Posts { get; set; }
}
public class Post
{
public int Id { get; set; }
public string Text { get; set; } = null!;
public int? RepostId { get; set; }
public virtual Repost? Repost { get; set; }
public virtual Repost? RepostNavigation { get; set; }
}
流暢的 API
builder.Entity<Post>(entity =>
{
entity.HasOne(d => d.Repost)
.WithMany(p => p.Posts)
.HasForeignKey(d => d.RepostId)
.OnDelete(DeleteBehavior.SetNull)
.HasConstraintName("FK_Posts_Posts");
});
builder.Entity<Repost>(entity =>
{
entity.ToTable("Repost");
entity.HasIndex(e => e.PostId, "IX_Repost_PostId")
.IsUnique();
entity.HasOne(d => d.Post)
.WithOne(p => p.RepostNavigation)
.HasForeignKey<Repost>(d => d.PostId)
.OnDelete(DeleteBehavior.Cascade);
});
洗掉帖子時,我需要在轉發中設定 null 。我可以使用 DeleteBehavior.NoAction,但問題是,有沒有辦法在帖子被洗掉時自動設定它?
UPD
解決方案
public class Post
{
public int Id { get; set; }
public string Text { get; set; }
public int? RepostId { get; set; }
public Post Repost { get; set; }
public ICollection<Post> Reposts { get; set; }
}
builder.Entity<Post>()
.HasOne(s => s.Repost)
.WithMany(s => s.Reposts)
.HasForeignKey(s => s.RepostId)
.IsRequired(false)
.OnDelete(DeleteBehavior.ClientSetNull);
uj5u.com熱心網友回復:
您的第一次嘗試很接近,只是使用自參考,或者您的屬性名稱與您需要顯式配置 FK 的型別名稱不同的任何參考:
這應該有效:
builder.Entity<Post>()
.HasOne(s => s.Repost)
.WithOne()
.HasForeignKey<Post>(s => s.RepostId)
.OnDelete(DeleteBehavior.ClientSetNull);
DeleteBehavior.SetNull不是一個有效的選項,因為 SQL Server 無法解決自參考 FK 上的該行為。如果您嘗試使用 a 在 SQL Server 中設定自參考 FK,ON DELETE SET NULL則會收到相同的錯誤。通過使用 ClientSetNull,EF 可以在洗掉記錄之前為任何相關物體發出 UPDATE 陳述句。
SetNull如果DbContext 在洗掉相關物體時碰巧跟蹤了相關物體,則似乎可以作業。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/465758.html
