1

我对为什么会收到此错误感到有些困惑:

Introducing FOREIGN KEY constraint 'FK_QuestionTerms_Terms_TermId' 
on table 'QuestionTerms' may cause cycles or multiple cascade paths. 
Specify ON DELETE NO ACTION or ON UPDATE NO ACTION, or modify other 
FOREIGN KEY constraints. Could not create constraint. See previous errors.

我有一个类问题和一个类术语,问题可能有任意数量的术语与之相关联,而术语可能有任意数量的问题与之相关联。所以我试图在两者之间建立多对多的关系。首先,我尝试使用约定,并允许 EntityFramework 创建数据库。这是问题类

public class Question
{
    public Guid Id { get; set; }
    public int QuestionNumber { get; set; }
    public string StatementHtml { get; set; }
    public string AnswerHeaderHtml { get; set; }
    public string NotesHtml { get; set; }
    public Guid CategoryId { get; set; }
    public Guid CourseId { get; set; }
    public Guid QuestionTypeId { get; set; }
    public Guid? SimulationId { get; set; }
    public Guid? SimulationTabId { get; set; }

    public ICollection<Term> Terms { get; set; }
    public ICollection<ReferenceItem> ReferenceItems { get; set; }

}

这是术语类

public class Term
{
   public Guid Id { get; set; }
   public string Name { get; set; }
   public string StatementHtml { get; set; }
   public string Authority { get; set; }
   public Guid ProductId { get; set; }

   public Product Product { get; set; }
   public ICollection<Question> Questions { get; set; }
}

我还尝试按如下方式覆盖 OnModelCreating,两个过程结果都是完全相同的错误代码。

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<Question>()
        .HasMany(q => q.Terms)
        .WithMany(t => t.Questions)
        .Map(x =>
            {
                x.MapLeftKey("QuestionId");
                x.MapRightKey("TermId");
                x.ToTable("QuestionTerms");
            });
} 
4

2 回答 2

2

问题是级联删除会在表之间来回移动。

例如,首先删除术语 A,这将删除问题 1,2 和 3。问题 1 也用于术语 B,因此必须删除术语 B .....

因此,它会阻止您创建此类约束。

这里有一个很好的解决方法:Entity Framework 4.1 InverseProperty Attribute and ForeignKey

编辑

这可能是其他问题的副作用。你应该从一个更简单的模型开始,然后逐渐建立它。

例如:

  • 为什么你同时拥有 ProductId 和 product
  • 为什么是 CategoryId 而不是 Category ...
于 2012-04-17T16:47:07.453 回答
2

尝试将其添加到您的 OnModelCreating() 方法中

  modelBuilder.Entity<Question>().HasRequired(oo => oo.Term).WithMany(oo => oo.Questions).WillCascadeOnDelete(false);
于 2012-04-17T16:40:21.633 回答