首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >实体框架核心6中0或1到多(0-1 -> N)关系的自引用

实体框架核心6中0或1到多(0-1 -> N)关系的自引用
EN

Stack Overflow用户
提问于 2022-02-01 12:17:27
回答 1查看 765关注 0票数 0

我有一个简单的实体,它可能有一些属于自己类型的孩子:

代码语言:javascript
复制
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关系)。我尝试用以下代码在实体框架核心6中配置它:

代码语言:javascript
复制
// Didn't work:
builder.HasOne(t => t.Parent).WithMany(t => t.Children)
    .HasForeignKey(t => t.ParentId)
    .OnDelete(DeleteBehavior.Restrict);

实际上,我已经尝试过HasForeignKeyHasPrincipalKeyDeleteBehavior.RestrictDeleteBehavior.SetNullDeleteBehavior.NoAction的所有组合,但我得到的只是:

在表'File‘上引入外键约束'FK_File_File_ParentId’可能会导致循环或多个级联路径。指定“删除不操作”或“更新不操作”,或修改其他外键约束。

有人能帮我吗?

注:我在这个实体上没有任何其他关系。实际上,这是我在这个领域中唯一拥有的实体。

更新:,太奇怪了!查看生成的SQL似乎太奇怪了:

代码语言:javascript
复制
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部件!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-02-01 12:31:13

问题是,您有一个循环关系,而且您的数据库不能为这些关系创建带有delete级联的外键约束(正如错误消息所示)。

我怀疑您当前的迁移仍然启用了DeleteBehavior.Restrict,这会导致应用迁移时出现错误。每次更改DeleteBehavior时,都需要更新迁移(删除旧迁移,并(重新)创建新迁移)。

您可以发布生成的迁移代码吗?

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70940443

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档