【问题标题】:Self-referencing zero or one to many (0-1 -> N) relation in Entity Framework Core 6Entity Framework Core 6 中的自引用零或一对多 (0-1 -> N) 关系
【发布时间】:2022-02-01 12:17:27
【问题描述】:

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

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 -&gt; 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 的所有组合,但我得到的只是这个:

在表上引入 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 部分!

【问题讨论】:

  • 您与此表还有其他.OnDelete 关系吗?
  • @JeremyLakeman 不,我没有。这是我在这个领域中唯一拥有的实体。

标签: c# entity-framework-core one-to-many self-referencing-table ef-core-6.0


【解决方案1】:

问题是您有一个循环关系,并且您的数据库无法为此类关系创建具有删除级联的外键约束(如错误消息所示)。

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

你能发布生成的迁移代码吗?

【讨论】:

  • 是的!那是确切的问题。我已经有几年没有编码了,而且似乎我必须重新学习太多东西::))) 谢谢。
猜你喜欢
  • 2022-01-25
  • 2017-10-05
  • 2019-06-27
  • 2017-02-27
  • 1970-01-01
  • 1970-01-01
  • 2021-03-16
  • 2018-03-08
  • 1970-01-01
相关资源
最近更新 更多