c# - EF Core 自引用一对多,在删除时设置 null 并在更新时级联可能会导致循环或多个路径
问题描述
所以,我试图创建的是一个关系,其中我有一个实体 ( ProductCategory
),它与自身具有一对多的关系。这在我没有操作 OnDelete 和 OnUpdate 时效果很好,但我希望在ParentId
删除父级 (SetNull OnDelete) 并在更新时级联时将(外键)设置为空。
不幸的是,当我尝试运行迁移时,我收到以下错误:
在表“ProductCategories”上引入 FOREIGN KEY 约束“FK_ProductCategories_ProductCategories_ParentId”可能会导致循环或多个级联路径。指定 ON DELETE NO ACTION 或 ON UPDATE NO ACTION,或修改其他 FOREIGN KEY 约束。无法创建约束或索引。请参阅以前的错误。
这是我使用的代码:
public class ProductCategory
{
public Guid Id { get; set; }
public string Slug { get; set; }
public string Name { get; set; }
public virtual ICollection<Product> Products { get; set; }
public Guid? ParentId { get; set; }
public virtual ProductCategory Parent { get; set; }
public virtual ICollection<ProductCategory> Children { get; set; }
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
// ...
modelBuilder.Entity<ProductCategory>(entity =>
{
entity.HasKey(t => t.Id);
entity.Property(t => t.Id)
.HasDefaultValueSql("NEWID()");
entity.Property(t => t.ParentId)
.HasDefaultValue(null);
entity.HasIndex(t => t.Slug)
.IsUnique();
entity.HasMany(t => t.Children)
.WithOne(c => c.Parent)
.HasForeignKey(c => c.ParentId)
.OnDelete(DeleteBehavior.SetNull)
.IsRequired(false);
entity.HasMany(t => t.Products)
.WithOne(p => p.Category)
.HasForeignKey(p => p.CategoryId)
.OnDelete(DeleteBehavior.SetNull)
.IsRequired(false);
});
}
顺便说一句,如果它有任何后果,我正在使用 SQL Server。
解决方案
推荐阅读
- python - 在多索引数据帧(熊猫)中生成组合方式
- python - 下面的 Win Error 2 是在带有 Python 3 的 Windows 8 上使用 Sublime Text 时收到的完整消息
- github - 从纯粹的技术角度来看,github 是否可以从公共存储库中删除我的电子邮件地址?
- django - 在 django 中使用多个参数过滤查询
- verilog - 什么是添加延迟的正确方法,例如。74HCT151,verilog 型号,所以它与数据表准确吗?
- api - GraphQL:对不断变化的类型/状态转换进行建模
- android - 我如何在颤动中单击交错网格视图中的项目
- r - 是否有一个 R 函数可以帮助将月度回报数据转换为年度平均值?
- amazon-web-services - 如何遍历 Glue DynamicFrame
- kubernetes - 在 kubernetes 集群中安装 gitlab-runner 后未激活 Gitlab 运行器 - 具有“新运行器。尚未连接”状态