首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >表中的FK可能会导致多个循环或多个级联路径。

表中的FK可能会导致多个循环或多个级联路径。
EN

Stack Overflow用户
提问于 2019-04-26 06:55:17
回答 2查看 51关注 0票数 1

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

代码语言:javascript
运行
复制
public class Question
{
    [Key]
    public int Id { get; set; }
    public List<Answer> Answers { get; set; }
    public List<SendedAnswer> SendedAnswers { get; set; }
}

有人可以将SendedAnswer发送到每个问题:

代码语言:javascript
运行
复制
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和错误,下面显示了在添加了这个ID的新迁移后,update-database的输出)。在后面的代码中,我使用与SendedAnswer相关的Answers检查Question (SendedAnswer被发送到解决一个Question)。

代码语言:javascript
运行
复制
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表如下所示:

代码语言:javascript
运行
复制
public class Answer
{
    [Key]
    public int Id { get; set; }

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

    public Question Question{ get; set; }
}

在为将AnswerId存储在ExecutionResult类中的新列中添加迁移之后,我得到以下错误:

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

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

代码语言:javascript
运行
复制
modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>();

我得到了错误,我的IdentityUsers缺少一对IDs等等(我的DbContext继承了IdentityDbContext<User>)。

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

如何在没有此错误的情况下将Answers表与ExecutionResult表匹配?我在这里做错了什么?

EN

回答 2

Stack Overflow用户

发布于 2019-04-26 07:36:17

在外键约束上添加[Required]属性以强制级联删除。或者,使用实体框架fluent api根据您的需要定义其他一些OnDelete行为。(https://www.learnentityframeworkcore.com/configuration/fluent-api/ondelete-method)

票数 0
EN

Stack Overflow用户

发布于 2019-04-26 09:48:36

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

代码语言:javascript
运行
复制
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);
}

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55862297

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档