桌面上的FK可能会导致多个循环或多个级联路径

时间:2019-04-26 06:55:18

标签: c# entity-framework

我正在创建一个看起来像这样的数据库:我有Questions表:

public class Question
{
    [Key]
    public int Id { get; set; }
    public List<Answer> Answers { get; set; }
    public List<SendedAnswer> SendedAnswers { get; set; }
}

有人可以向每个问题发送SendedAnswer

public class SendedAnswer
{
    [Key]
    public int Id { get; set; }

    [ForeignKey("Question")]
    public int QuestionId{ get; set; }

    public Question Question { get; set; }

    public List<ExecutionResult> ExecutionResults { get; set; }
}

发送答案时,我的系统会检查答案是否与输出有关

ExecutionResultID存储到SendedAnswerAnswer(我添加了AnswerId,下面显示的错误显示在update-database的输出中使用此ID添加了新的迁移)。在后面的代码中,我正在检查SendedAnswer和与Answers相关的QuestionSendedAnswer被发送来解析一个Question)。

public class ExecutionResult
{
    [Key]
    public int Id { get; set; }

    [ForeignKey("SendedAnswer")]
    public int SendedAnswerId { get; set; }

    public SendedAnswer SendedAnswer { get; set; }

    [ForeignKey("Answer")]
    public int AnswerId { get; set; }

    public Answer Answer { get; set; }
}

Answers表如下:

public class Answer
{
    [Key]
    public int Id { get; set; }

    [ForeignKey("Question")]
    public int QuestionId{ get; set; }

    public Question Question{ get; set; }
}

在使用新列添加迁移以在AnswerId类中存储ExecutionResult后,出现此错误:

  

在表'ExecutionResults'上引入FOREIGN KEY约束'FK_dbo.ExecutionResults_dbo.Answers_AnswerId'可能会导致循环或多个级联路径。指定ON DELETE NO ACTION或ON UPDATE NO ACTION,或修改其他FOREIGN KEY约束。   无法创建约束或索引。查看以前的错误。

当我将此行添加到DbContext中时(采用覆盖方法):

modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>();

我收到错误消息,说我的IdentityUsers缺少一对IDs等(我的DbContext继承自IdentityDbContext<User>)。

我的问题是,如何处理此错误?当我在删除路径上获得多个级联时?对我来说,这看起来还不错,因为删除Answer之后我想删除ExecutionResult,而且很明显我需要在ExecutionResultAnswerSendedAnswer中添加FK。

如何将Answers表与ExecutionResult表匹配而没有该错误?我在这里做错了什么?

2 个答案:

答案 0 :(得分:0)

在外键约束上添加keys = ['a', 'b', 'c'] values = [123, 456, 789] build_src = zip(keys, values) build_list = {key: val for key, val in build_src} 属性以强制级联删除。 或者,根据您的需要,使用实体框架的fluent api定义其他OnDelete行为。 (https://www.learnentityframeworkcore.com/configuration/fluent-api/ondelete-method

答案 1 :(得分:0)

modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>();中删除OnModelCreating(DbModelBuilder modelBuilder),并添加以下 Fluent API 配置,如下所示:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
      base.OnModelCreating(modelBuilder);

      modelBuilder.Entity<ExecutionResult>().HasRequired(er => er.SendedAnswer)
            .WithMany(sa => sa.ExecutionResults).HasForeignKey(er => er.SendedAnswerId)
            .WillCascadeOnDelete(false);

      modelBuilder.Entity<ExecutionResult>().HasRequired(er => er.Answer)
            .WithMany().HasForeignKey(er => er.AnswerId).WillCascadeOnDelete(false);
}

现在再次生成迁移并更新数据库。