首页 > 解决方案 > 使用 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;
            }

因为我不需要级联删除行为。

在这些不同的尝试之后,我再次进行了添加迁移和更新数据库。但错误仍然相同。

有什么建议么?

标签: asp.netasp.net-mvcasp.net-core

解决方案


最后,我进入迁移文件并从级联到限制到处更改。因为无论如何我都不想使用级联。现在它可以工作了。


推荐阅读