FK на столе может вызвать несколько циклов или несколько каскадных путей - PullRequest
1 голос
/ 26 апреля 2019

Я создаю базу данных, которая выглядит следующим образом: у меня есть Questions таблица:

public class Question
{
    [Key]
    public int Id { get; set; }
    public List<Answer> Answers { get; set; }
    public List<SendedAnswer> SendedAnswers { get; set; }
}

Кто-то может отправить SendedAnswer на каждый вопрос:

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

Хотяответ отправлен, моя система проверяет, связаны ли ответы с выводом

ExecutionResult, хранит ID с SendedAnswer и Answer (я добавил AnswerId, и ошибка, которую я показываю ниже, отображается в выходных данных изupdate-database после добавления новой миграции с этим идентификатором).В моем коде я проверяю SendedAnswer с Answers, относящимся к Question (SendedAnswer отправляется для разрешения одного Question).

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 таблица выглядит следующим образом:

public class Answer
{
    [Key]
    public int Id { get; set; }

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

    public Question Question{ get; set; }
}

После добавления миграции с новым столбцом для хранения AnswerId в ExecutionResult классе, я получаю эту ошибку:

Введение ограничения FOREIGN KEY 'FK_dbo.ExecutionResults_dbo.Ответы_AnswerId 'в таблице' ExecutionResults 'могут вызывать циклы или несколько каскадных путей.Укажите ON DELETE NO ACTION или ON UPDATE NO ACTION, либо измените другие ограничения FOREIGN KEY.Не удалось создать ограничение или индекс.См. Предыдущие ошибки.

Когда я добавил эту строку в мой DbContext (в переопределенном методе):

modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>();

Я получаю ошибки, что в моем IdentityUsers отсутствуетпара IDs и т. д. (мое наследование DbContext от IdentityDbContext<User>).

Мой вопрос: как бороться с этой ошибкой?Когда я получу несколько каскадов на пути удаления?Для меня это выглядит нормально, потому что после удаления Answer я хочу удалить ExecutionResult, и это выглядит довольно очевидно, что мне нужны FK в ExecutionResult до Answer и SendedAnswer.

Как сопоставить таблицу Answers с таблицей ExecutionResult без этой ошибки?Что я тут не так сделал?

Ответы [ 2 ]

0 голосов
/ 26 апреля 2019

Удалите modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>(); из OnModelCreating(DbModelBuilder modelBuilder) и добавьте следующую Fluent API конфигурацию следующим образом:

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 голосов
/ 26 апреля 2019

Добавить [Required] Атрибут ограничений внешнего ключа для принудительного удаления каскада. В качестве альтернативы можно использовать свободный интерфейс API структуры сущностей, чтобы определить другое поведение OnDelete в зависимости от ваших потребностей. (https://www.learnentityframeworkcore.com/configuration/fluent-api/ondelete-method)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...