Self-referencing Entity Framework 核心 6 中的零或一对多 (0-1 -> N) 关系
Self-referencing zero or one to many (0-1 -> N) relation in Entity Framework Core 6
我有这个简单的实体,它可能有一些 children 自己的类型:
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; }
}
实际上,一个单独的实体可能有一个 parent 自己的类型,也可能没有;对于它自己类型的其他一些实体(0-1 -> N
关系),它可能是 parent。我尝试使用以下代码行在 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
的所有组合,但我只得到了这是:
Introducing FOREIGN KEY constraint 'FK_File_File_ParentId' on table
'File' may cause cycles or multiple cascade paths. Specify ON DELETE
NO ACTION or ON UPDATE NO ACTION, or modify other FOREIGN KEY
constraints.
有人可以帮我吗?
注意:我与该实体没有任何其他关系。事实上,这是我在这个域中拥有的唯一实体。
更新:这很奇怪!查看生成的 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
,您都需要更新迁移(删除旧迁移,然后(重新)创建一个新迁移)。
你能post 生成的迁移代码吗?
我有这个简单的实体,它可能有一些 children 自己的类型:
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; }
}
实际上,一个单独的实体可能有一个 parent 自己的类型,也可能没有;对于它自己类型的其他一些实体(0-1 -> N
关系),它可能是 parent。我尝试使用以下代码行在 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
的所有组合,但我只得到了这是:
Introducing FOREIGN KEY constraint 'FK_File_File_ParentId' on table 'File' may cause cycles or multiple cascade paths. Specify ON DELETE NO ACTION or ON UPDATE NO ACTION, or modify other FOREIGN KEY constraints.
有人可以帮我吗?
注意:我与该实体没有任何其他关系。事实上,这是我在这个域中拥有的唯一实体。
更新:这很奇怪!查看生成的 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
,您都需要更新迁移(删除旧迁移,然后(重新)创建一个新迁移)。
你能post 生成的迁移代码吗?