0

В моей модели db у меня есть таблица вакансий и таблица JobResults.Обязательная связь с каскадным удалением (Entity Framework)

Определение модели выглядит следующим образом:

public class Job 
{ 
    public int Id { get; set; } 
    public virtual JobResult Result { get; set; } 
} 

public class JobResult 
{ 
    public int JobId { get; set; } 
    public virtual Job Job { get; set; } 
} 

И текучее API настраиваемого отношения заключается в следующем:

modelBuilder.Entity<Job>() 
      .HasRequired(x => x.Result) 
      .WithRequiredPrincipal(x => x.Job) 
      .WillCascadeOnDelete(true); 

    modelBuilder.Entity<JobResult>() 
      .HasKey(x => x.JobId); 

Как вы видите, это требуется к необходимости отношений, где они оба передают идентификатор задания в качестве первичного ключа. Когда задание удалено, я явно хочу, чтобы JobResult также был удален (поэтому я добавил WillCascadeOnDelete()).

Однако, когда я обновить свою базу данных с определениями выше, я получаю следующее сообщение об ошибке:

Introducing FOREIGN KEY constraint 'FK_dbo.JobResults_dbo.Jobs_JobId' on table 'JobResults' 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.

Это исключительно происходит, когда я включаю WillCascadeOnDelete().

Почему это происходит?

+0

Вы уверены, что это ваши единственные столы, относящиеся к Jobresult или работе? Потому что я просто попробовал ваш код, и он не дал никаких ошибок. Вы знаете, что по умолчанию активируется каскадное удаление, а если есть две таблицы, ссылающиеся на одну и ту же таблицу, то 2 раза каскадное удаление - проблема –

ответ

1

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

Я предлагаю вам взглянуть на это post и проверить, нет ли у вас такой ситуации, как пример, показанный в ответе @KristofClaes.

Вы можете избежать таких неоднозначных путей удаления, отключив каскадное удаление с помощью Fluent API или определив некоторые из отношений как необязательные (с помощью NULL-ключа).

+0

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

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