C# 表上的FK可能导致多个循环或多个级联路径

C# 表上的FK可能导致多个循环或多个级联路径,c#,entity-framework,C#,Entity Framework,我正在创建一个如下所示的数据库:我有问题表: public class Question { [Key] public int Id { get; set; } public List<Answer> Answers { get; set; } public List<SendedAnswer> SendedAnswers { get; set; } } 发送答案时,我的系统检查答案是否与输出相关 ExecutionResult将ID存储

我正在创建一个如下所示的数据库:我有
问题
表:

public class Question
{
    [Key]
    public int Id { get; set; }
    public List<Answer> Answers { get; set; }
    public List<SendedAnswer> SendedAnswers { get; set; }
}
发送答案时,我的系统检查答案是否与输出相关

ExecutionResult
ID
存储到
SendedAnswer
Answer
(我添加了
AnswerId
,下面显示的错误显示在使用此ID添加新迁移后的
更新数据库的输出中)。在我的代码隐藏中,我正在检查
SendedAnswer
问题相关的
答案
SendedAnswer
用于解决一个
问题

答案
表格如下所示:

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

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

    public Question Question{ get; set; }
}
ExecutionResult
类中添加带有存储
AnswerId
的新列的迁移后,我得到以下错误:

在表“ExecutionResults”上引入外键约束“FK_dbo.ExecutionResults_dbo.AnswerId”可能会导致循环或多个级联路径。指定“在删除时不执行操作”或“在更新时不执行操作”,或修改其他外键约束。 无法创建约束或索引。请参阅前面的错误

当我将此行添加到我的
DbContext
(在重写方法中)时:

modelBuilder.Conventions.Remove();
我得到的错误是,我的
IdentityUsers
缺少两个
id
等(我的DbContext继承自
IdentityDbContext

我的问题是,如何处理这个错误?当我在删除路径上得到多个级联时?对我来说,它看起来还可以,因为在删除
Answer
之后,我想删除
ExecutionResult
,很明显我需要在
ExecutionResult
中使用FK来
Answer
SendedAnswer


如何将
Answers
表与
ExecutionResult
表匹配而不出现该错误?我做错了什么?

在外键约束上添加
[必需]
属性以强制级联删除。
或者,根据您的需要,使用实体框架fluent api定义其他一些OnDelete行为。()

在外键约束上添加
[必需]
属性以强制级联删除。
或者,根据您的需要,使用实体框架fluent api定义其他一些OnDelete行为。()

删除
modelBuilder.Conventions.Remove()来自建模创建(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);
}
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
基于模型创建(modelBuilder);
modelBuilder.Entity().HasRequired(er=>er.SendedAnswer)
.WithMany(sa=>sa.ExecutionResults).HasForeignKey(er=>er.SendedAnswerId)
.WillCascadeOnDelete(假);
modelBuilder.Entity().HasRequired(er=>er.Answer)
.WithMany().HasForeignKey(er=>er.AnswerId).WillCascadeOnDelete(false);
}

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

删除
modelBuilder.Conventions.Remove()来自建模创建(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);
}
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
基于模型创建(modelBuilder);
modelBuilder.Entity().HasRequired(er=>er.SendedAnswer)
.WithMany(sa=>sa.ExecutionResults).HasForeignKey(er=>er.SendedAnswerId)
.WillCascadeOnDelete(假);
modelBuilder.Entity().HasRequired(er=>er.Answer)
.WithMany().HasForeignKey(er=>er.AnswerId).WillCascadeOnDelete(false);
}

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

实际上您不需要ExecutionResult表,将用户答案放入SendAnswer表,或者如果您想在ExecutionResult表中放入更多详细信息,那么您应该从ExecutionResult表中删除AnswerID,根据SendAnswerId您可以获得AnswerID。我需要执行表。发送拒绝存储
code
,执行结果存储
从该代码输出。我需要另一个表来存储该输出并将其与相关问题的答案一起检查如果我们在
问题中有4个答案,我需要4个ExecutionResult,因为当您发送答案时,ExecutionResult会触发每个答案(4个答案,4个结果),然后它会被发送(而不是“发送”)…@michasaucer检查我的答案!它会解决你的问题!实际上,您不需要ExecutionResult表,将用户答案放入SendAnswer表,或者如果您想在ExecutionResult表中放入更多详细信息,那么您应该从ExecutionResult表中删除AnswerID,根据SendAnswerId您可以获得AnswerID。我需要执行表。发送拒绝存储
code
,执行结果存储
从该代码输出。我需要另一个表来存储该输出并将其与相关问题的答案一起检查如果我们在
问题中有4个答案,我需要4个ExecutionResult,因为当您发送答案时,ExecutionResult会触发每个答案(4个答案,4个结果),然后它会被发送(而不是“发送”)…@michasaucer检查我的答案!它会解决你的问题!
modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>();
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);
}