【问题标题】:Specify ON DELETE NO ACTION create 3 foreign keys tha same table - Entity Framework指定 ON DELETE NO ACTION 为同一个表创建 3 个外键 - 实体框架
【发布时间】:2019-09-05 20:04:19
【问题描述】:

我正在通过实体框架创建一个表,其中包含同一个表的 3 个外键Account

public class EvaluationFormQuestionEvaluator
{
        public Guid Id { get; set; }
        public Account Account { get; set; }
        public Guid AccountId { get; set; }
        public EvaluationForm EvaluationForm { get; set; }
        public Guid FormId { get; set; }
        public Guid Evaluator_1_Id { get; set; }
        public Account Evaluator_1 { get; set; }
        public Guid Evaluator_2_Id { get; set; }
        public Account Evaluator_2 { get; set; }
}

当我生成迁移并运行应用程序时遇到此错误

System.Data.SqlClient.SqlException:在表“EvaluationFormQuestionEvaluator”上引入 FOREIGN KEY 约束“FK_EvaluationFormQuestionEvaluator_Evaluator1”可能会导致循环或多个级联路径。指定 ON DELETE NO ACTION 或 ON UPDATE NO ACTION,或修改其他 FOREIGN KEY 约束。

IEntityTypeConfiguration类中,定义如下

public class EvaluationFormQuestionEvaluatorConfiguration : IEntityTypeConfiguration<EvaluationFormQuestionEvaluator>
{
    public void Configure(EntityTypeBuilder<EvaluationFormQuestionEvaluator> entity)
    {
        entity.ToTable("EvaluationFormQuestionEvaluator", ApplicationDataContext.DEFAULT_SCHEMA);

        entity.Property(e => e.Id).ValueGeneratedNever();

        entity.HasOne(d => d.EvaluationForm)
                .WithMany()
                .HasForeignKey(d => d.FormId)
                .IsRequired()
                .HasConstraintName("FK_EvaluationFormQuestionEvaluator_EvaluatorForm");

        entity.HasOne(d => d.Account)
                .WithMany()
                .HasForeignKey(d => d.AccountId)
                .IsRequired()
                .HasConstraintName("FK_EvaluationFormQuestionEvaluator_Account");

        entity.HasOne(d => d.Evaluator_1)
                .WithMany()
                .HasForeignKey(d => d.Evaluator_1_Id)
                .IsRequired()
                .HasConstraintName("FK_EvaluationFormQuestionEvaluator_Evaluator1");

        entity.HasOne(d => d.Evaluator_2)
                .WithMany()
                .HasForeignKey(d => d.Evaluator_2_Id)
                .IsRequired()
                .HasConstraintName("FK_EvaluationFormQuestionEvaluator_Evaluator2");
    }
}

这种形式是最正确的创建方式吗?这个错误的解决方法是什么?

【问题讨论】:

    标签: c# sql-server entity-framework


    【解决方案1】:

    我相信警告是基于您对帐户的引用不止一次,如果要删除帐户,级联可能会出错。通常当你有一个必需的关系 A=Requires=>B 时,如果 B 被删除,那么默认情况下 A 也会被删除。 (需要默认为级联)EF 已将您的模型标记为具有可能无法可靠级联的关系。

    我认为要解决此问题,您应该将附加帐户引用 DeleteAction 设置为 Restrict 以满足 EF。如果您在未先清理任何引用它的内容的情况下尝试删除引用的帐户,EF 将引发错误。

        entity.HasOne(d => d.Evaluator_1)
                .WithMany()
                .HasForeignKey(d => d.Evaluator_1_Id)
                .IsRequired()
                .OnDelete(DeleteBehavior.Restrict) 
                .HasConstraintName("FK_EvaluationFormQuestionEvaluator_Evaluator1");
    
        entity.HasOne(d => d.Evaluator_2)
                .WithMany()
                .HasForeignKey(d => d.Evaluator_2_Id)
                .IsRequired()
                .OnDelete(DeleteBehavior.Restrict)
                .HasConstraintName("FK_EvaluationFormQuestionEvaluator_Evaluator2");
    

    我认为使用默认级联行为的主帐户引用应该没问题。

    无论如何,试一试。这有点太多了,无法发表评论,因为它不是我可以轻易尝试和复制的东西。如果它不起作用,请发表评论,我可以删除答案。 :)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-08-01
      • 2021-05-29
      • 2021-10-25
      • 2015-03-17
      • 1970-01-01
      相关资源
      最近更新 更多