簡體   English   中英

Entity Framework Core 6 中的自引用零或一對多 (0-1 -> N) 關系

[英]Self-referencing zero or one to many (0-1 -> N) relation in Entity Framework Core 6

我有這個簡單的實體,它可能有一些自己類型的孩子:

public class File {

    public long Id { get; set; }

    public File? Parent { get; set; }
    public long? ParentId { get; set; }

    public IList<File>? Children { get; set; }

    public string Name { get; set; }
}

實際上,單個實體可能有自己類型的父級,也可能沒有; 它可能是其自身類型的一些其他實體的父級( 0-1 -> N關系)。 我嘗試使用以下代碼行在 Entity Framework Core 6 中對其進行配置:

// Didn't work:
builder.HasOne(t => t.Parent).WithMany(t => t.Children)
    .HasForeignKey(t => t.ParentId)
    .OnDelete(DeleteBehavior.Restrict);

實際上,我已經嘗試過HasForeignKeyHasPrincipalKeyDeleteBehavior.RestrictDeleteBehavior.SetNullDeleteBehavior.NoAction的所有組合,但我得到的只是:

在表 'File' 上引入 FOREIGN KEY 約束 'FK_File_File_ParentId' 可能會導致循環或多個級聯路徑。 指定 ON DELETE NO ACTION 或 ON UPDATE NO ACTION,或修改其他 FOREIGN KEY 約束。

任何人都可以幫助我嗎?

注意:我在這個實體上沒有任何其他關系。 實際上,這是我在該領域擁有的唯一實體。

更新:這很奇怪:查看生成的 SQL 似乎太奇怪了:

CREATE TABLE [File] (
    [Id] bigint NOT NULL IDENTITY,
    [ParentId] bigint NULL,
    [Name] varchar(32) NOT NULL,
    CONSTRAINT [PK_File] PRIMARY KEY ([Id]),
    CONSTRAINT [FK_File_File_ParentId] FOREIGN KEY ([ParentId])
        REFERENCES [File] ([Id]) ON DELETE CASCADE
);

似乎 EF 忽略了.OnDelete(DeleteBehavior...)命令,它在所有情況下都在創建ON DELETE CASCADE部分!

問題是您具有循環關系,並且您的數據庫無法為此類關系創建帶有刪除級聯的外鍵約束(如錯誤消息所示)。

我懷疑您當前的遷移仍然啟用了DeleteBehavior.Restrict ,這會導致應用遷移時出錯。 每次更改DeleteBehavior時,都需要更新遷移(刪除舊遷移,並(重新)創建新遷移)。

您可以發布生成的遷移代碼嗎?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM