在實體框架7中指定ON DELETE NO ACTION?

entity-framework-core

在Entity Framework 7中,當我嘗試應用遷移時,我收到錯誤

在表'ChangeOrder'上引入FOREIGN KEY約束'FK_ChangeOrder_User_CreatedByID'可能會導致循環或多個級​​聯路徑。指定ON DELETE NO ACTION或ON UPDATE NO ACTION,或修改其他FOREIGN KEY約束。
無法創建約束。查看以前的錯誤。

我知道在舊版本的Entity Framework中你可以通過添加來解決這個問題

modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>();

到的DbContext但EF7 modelBuilder似乎並不具有.Conventions它和谷歌只返回舊的EF 4雖然EF 6的結果。

如何在Entity Framework 7中特定ON DELETE NO ACTION約束?

編輯:奧列格提供的答案顯然是按照外鍵進行的,但我想在全局範圍內進行,因為使用一行代碼來全局聲明這一點會更容易,然後必須為每一個代碼指定代碼。我將最終擁有數百種關係。

編輯2:奧列格的代碼

modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>();
modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>();

一般承認的答案

在GitHub上挖掘,並與MS的一個非常有耐心的人一起工作,目前的解決方案是將其添加到DbContext

protected override void OnModelCreating(ModelBuilder modelbuilder)
{
    foreach (var relationship in modelbuilder.Model.GetEntityTypes().SelectMany(e => e.GetForeignKeys()))
    {
        relationship.DeleteBehavior = DeleteBehavior.Restrict;
    }

    base.OnModelCreating(modelbuilder);
}

熱門答案

那個工程

modelBuilder.Entity("myNamespace.Models.ChangeOrder", b =>
    {
        b.HasOne("myNamespace.Models.User")
            .WithMany()
            .HasForeignKey("CreatedByID")
            .OnDelete(DeleteBehavior.Cascade);
    });

將意味著使用REFERENCES [dbo].[User] ([CreatedByID]) ON DELETE CASCADE創建FK_ChangeOrder_User_CreatedByID REFERENCES [dbo].[User] ([CreatedByID]) ON DELETE CASCADE 。它應該存在於遷移期間創建的YourContextModelSnapshot.cs protected override void BuildModel(ModelBuilder modelBuilder)中。我不確定我是否完全理解您的問題,但我認為您應該將此類構造添加到XXXModelSnapshot.cs或刪除此處已存在的不需要的構造。

更新:我看到你在模型中遇到了問題。您有以下屬性

modelBuilder.Entity("myNamespace.Models.ChangeOrder", b =>
    {
        b.HasOne("myNamespace.Models.User")
            .WithMany()
            .HasForeignKey("CreatedByID")
            .OnDelete(DeleteBehavior.Cascade);
    });

默認情況下,遷移嘗試在所有屬性上設置DeleteBehavior.Cascade

您可以通過更改OnModelCreating來覆蓋行為, DeleteBehavior.Restrict為所有鍵設置DeleteBehavior.Restrict行為,或者僅在一個鍵上設置DeleteBehavior.CascadeDeleteBehavior.SetNull行為。例如,下面的代碼使用DeleteBehavior.CascadeCreatedByID (產生ON DELETE CASCADE上外鍵)和DeleteBehavior.Restrict上其它外鍵(無ON DELETE上外鍵):

modelBuilder.Entity("myNamespace.Models.ChangeOrder", b =>
    {
        b.HasOne("myNamespace.Models.User")
            .WithMany()
            .HasForeignKey("CreatedByID")
            .OnDelete(DeleteBehavior.Cascade);
    });



許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因