繁体   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