介绍FOREIGN KEY约束错误问题

时间:2012-04-17 16:11:18

标签: c# ef-code-first entity-framework-4.3

我有点困惑,为什么我收到这个错误:

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

2 个答案:

答案 0 :(得分:2)

尝试在OnModelCreating()方法中添加它

  modelBuilder.Entity<Question>().HasRequired(oo => oo.Term).WithMany(oo => oo.Questions).WillCascadeOnDelete(false);

答案 1 :(得分:2)

问题是cacade delete会在表之间来回传递。

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

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

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

修改

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

例如:

  • 为什么同时拥有ProductId和产品
  • 为什么选择CategoryId而不是Category ...