我有一个简单的实体,它可能有一些属于自己类型的孩子:
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中配置它:
// 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的所有组合,但我得到的只是:
在表'File‘上引入外键约束'FK_File_File_ParentId’可能会导致循环或多个级联路径。指定“删除不操作”或“更新不操作”,或修改其他外键约束。
有人能帮我吗?
注:我在这个实体上没有任何其他关系。实际上,这是我在这个领域中唯一拥有的实体。
更新:,太奇怪了!查看生成的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部件!
发布于 2022-02-01 12:31:13
问题是,您有一个循环关系,而且您的数据库不能为这些关系创建带有delete级联的外键约束(正如错误消息所示)。
我怀疑您当前的迁移仍然启用了DeleteBehavior.Restrict,这会导致应用迁移时出现错误。每次更改DeleteBehavior时,都需要更新迁移(删除旧迁移,并(重新)创建新迁移)。
您可以发布生成的迁移代码吗?
https://stackoverflow.com/questions/70940443
复制相似问题