2012-04-17 2 views
1

Я немного запутался, почему я получаю эту ошибку:Вводя FOREIGN KEY ошибка ограничения проблемы

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

Проблема заключается в том, что каскадно удалить бы вернуться назад и вперед между таблицами.

Например первое удаление термин А, который будет удалять вопрос 1,2 и 3. Вопрос 1 также используется в перспективе B так термин B должен быть удален .....

Поэтому останавливает вас создание таких ограничений ,

Существует хорошее покрытие, как это исправить здесь: Entity Framework 4.1 InverseProperty Attribute and ForeignKey

Редактировать

Это может быть побочным эффектом других проблем. Вы должны начать с гораздо более простой модели, а затем постепенно ее наращивать.

Например:

  • Почему у вас есть как ProductId и продукт
  • Почему CategoryId и не Категория ...
+0

Проблема в том, что у меня нет сингулярного внешнего ключа между вопросом или термином. Каждый пример, который я видел, касается этой проблемы, когда две таблицы связаны внешним ключом. – Siegeon

+0

Я понимаю вашу точку зрения, может быть, я ошибаюсь в процессе; но в случае productId и продукта одна из них - ассоциация (FK), а другая - свойство навигации. Разве это не правильный способ его кодирования? – Siegeon

+0

Хотя ваш ответ напрямую не ответил на мой вопрос, он действительно запустил меня по правильному пути. Спасибо. – Siegeon

2

Попробуйте добавить его в свой OnModelCreating метод()

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

При попытке вышеуказанной конфигурации WithMany (оо => oo.Questions) не позволяет навигации по Вопросам; это (параметр) System.Collections.Generic.ICollection и дает мне варианты, такие как добавление, очистка и удаление. – Siegeon

Смежные вопросы