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);
}