asp.net - 使用 ON DELETE NO ACTION 引入 FOREIGN KEY 约束不起作用
问题描述
我有 4 个表,它们之间的外键为:分类 - 分类级别 - 分类值 - 分类语言
在 add-migration 上没问题,但是在运行 update-database 时出现错误:
Introducing FOREIGN KEY constraint 'FK_dbClassificationValue_dbClassificationLevel_ClassificationLevelId' on table 'dbClassificationValue' may cause cycles or multiple cascade paths. Specify ON DELETE NO ACTION or ON UPDATE NO ACTION, or modify other FOREIGN KEY constraints.
Could not create constraint or index. See previous errors.
错误中提到的表定义为:
public class SuClassificationLevelModel
{
public int Id { get; set; }
public int ClassificationId { get; set; }
public int Sequence { get; set; }
public bool DateLevel { get; set; }
public bool OnTheFly { get; set; }
public bool Alphabetically { get; set; }
public bool CanLink { get; set; }
public bool InDropDown { get; set; }
public Guid CreatorId { get; set; }
public Guid ModifierId { get; set; }
public DateTime ModifiedDate { get; set; }
public DateTime CreatedDate { get; set; }
public virtual SuClassificationModel Classification { get; set; }
public virtual ICollection<SuClassificationLevelLanguageModel> ClassificationLevelLanguages { get; set; }
public virtual ICollection<SuClassificationValueModel> ClassificationValues { get; set; }
}
和
public class SuClassificationValueModel
{
public int Id { get; set; }
public int ClassificationLevelId { get; set; }
public int ParentValueId { get; set; }
public DateTimeOffset DateFrom { get; set; }
public DateTimeOffset DateTo { get; set; }
public virtual SuClassificationLevelModel ClassificationLevel { get; set; }
public virtual ICollection<SuClassificationValueLanguageModel> ClassificationValueLanguages { get; set; }
}
我在我的 DBContect 类中添加了删除行为行:
modelBuilder.Entity<SuClassificationValueModel>()
.HasOne(u => u.ClassificationLevel)
.WithMany(u => u.ClassificationValues)
.HasForeignKey(u => u.ClassificationLevelId)
.OnDelete(DeleteBehavior.Restrict);
此外,我已将其放在级联结构的所有表之间的外键上。
modelBuilder.Entity<SuClassificationLevelModel>()
.HasOne(u => u.Classification)
.WithMany(u => u.ClassificationLevels)
.HasForeignKey(u => u.ClassificationId)
.OnDelete(DeleteBehavior.Restrict);
modelBuilder.Entity<SuClassificationValueModel>()
.HasOne(u => u.ClassificationLevel)
.WithMany(u => u.ClassificationValues)
.HasForeignKey(u => u.ClassificationLevelId)
.OnDelete(DeleteBehavior.Restrict);
modelBuilder.Entity<SuClassificationValueLanguageModel>()
.HasOne(u => u.ClassificationValue)
.WithMany(u => u.ClassificationValueLanguages)
.HasForeignKey(u => u.ClassificationValueId)
.OnDelete(DeleteBehavior.Restrict);
此外,我尝试为所有外键设置它:
foreach (var relationship in modelBuilder.Model.GetEntityTypes().SelectMany(e => e.GetForeignKeys()))
{
relationship.DeleteBehavior = DeleteBehavior.Restrict;
}
因为我不需要级联删除行为。
在这些不同的尝试之后,我再次进行了添加迁移和更新数据库。但错误仍然相同。
有什么建议么?
解决方案
最后,我进入迁移文件并从级联到限制到处更改。因为无论如何我都不想使用级联。现在它可以工作了。
推荐阅读
- python - Change value in pandas series based on hour of the day using df.apply and if statement
- sql - 在一个 Select 语句中连接 3 个表
- python - 标记文本中出现的所有位置
- python - 我可以在 Pandas 中以某种方式在组中应用增量值吗?
- kotlin - Kotlin 等于自定义泛型类
- java - java.lang.UnsupportedOperationException 与 ArrayList()
- python - Discord.py:我怎样才能获得机器人角色并改变他的颜色?
- python - 无法使用 axios 和 python 发送/接收标头
- factor-analysis - 使用 factor_analyzer 时出错。指定索引传递的空数据
- azure-devops - 当我使用 x64 和 .NET5 时,如何在 Azure 管道中运行单元测试?