【发布时间】: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 -> N 关系)。我尝试使用以下代码行在 Entity Framework Core 6 中对其进行配置:
// Didn't work:
builder.HasOne(t => t.Parent).WithMany(t => t.Children)
.HasForeignKey(t => t.ParentId)
.OnDelete(DeleteBehavior.Restrict);
实际上我已经尝试了HasForeignKey、HasPrincipalKey、DeleteBehavior.Restrict、DeleteBehavior.SetNull 和DeleteBehavior.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