C # FrameworkCore и MySQL: невозможно удалить или обновить родительскую строку: ограничение внешнего ключа не выполняется - PullRequest
0 голосов
/ 29 августа 2018

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

Исключение произошло: CLR / Microsoft.EntityFrameworkCore.DbUpdateException Необработанный исключение типа «Microsoft.EntityFrameworkCore.DbUpdateException» произошло в Microsoft.EntityFrameworkCore.dll: «Произошла ошибка при обновлении записей. Смотрите внутреннее исключение для деталей. Обнаружены внутренние исключения, см. Раздел $ исключение в окне переменных. подробности. Внутреннее исключение MySql.Data.MySqlClient.MySqlException : Невозможно удалить или обновить родительскую строку: ограничение внешнего ключа не выполнено (movies. film_actor, ОГРАНИЧЕНИЕ film_actor_actor ИНОСТРАННЫЙ КЛЮЧ (ActorId) ССЫЛКИ actor (actorid)) в System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw () в MySqlConnector.Core.ResultSet.d__1.MoveNext () в C: \ Проекты \ mysqlconnector \ SRC \ MySqlConnector \ Ядро \ ResultSet.cs: линия 44

Вот вызываемый метод:

internal static void DeleteItem()
{
    Console.WriteLine("Delete an Actor");

    Console.WriteLine("Enter an Actor ID");
    var actorId = Console.ReadLine().ToInt();

    var actor = MoviesContext.Instance.Actors.SingleOrDefault(a => a.ActorId == actorId);
    if (actor == null) {
        Console.WriteLine($"Actor with id {actorId} not found.");
    }
    else {
        Console.WriteLine("Existing Actors");
        WriteActors();

        MoviesContext.Instance.Actors.Remove(actor);

        MoviesContext.Instance.SaveChanges();

        Console.WriteLine("With actor removed.");
        WriteActors();
    }
}

Я проверял свой код снова и снова, и он идеально соответствует коду инструктора. К сожалению, никто не отвечает на мой вопрос через школьную доску, поэтому я перенес свой вопрос сюда.

Фреймворк перепроектировал базу данных для создания всех строительных лесов для кода. Программа выдает это исключение при отправке оператора MySQL для SaveChanges().

Однако, это должно быть из этой таблицы, потому что SaveChanges() используется в более ранней части кода для чего-то другого, и не выдает никаких ошибок.

Идеи? Это сводит меня с ума! Благодарю. :)

Using:

C# 
ConsoleTables 
EntityFrameworkCore 
 + .Design 
 + .Tools         // Used as a DotNetCliToolReference 
 + .Tools.DotNet  // Used as a DotNetCliToolReference 
 + .MySql 
 + .MySql.Design 

Я ничего не знаю об ограничениях, но вот фрагмент кода, который я обнаружил, что сгенерированная среда, которая может быть вкладчиком:

modelBuilder.Entity<FilmActor>(entity =>
            {
                entity.HasKey(e => new { e.FilmId, e.ActorId });

                entity.ToTable("film_actor");

                entity.HasIndex(e => e.ActorId)
                    .HasName("film_actor_actor_idx");

                entity.Property(e => e.FilmId).HasColumnType("int(11)");

                entity.Property(e => e.ActorId).HasColumnType("int(11)");

                entity.HasOne(d => d.Actor)
                    .WithMany(p => p.FilmActor)
                    .HasForeignKey(d => d.ActorId)
                    .OnDelete(DeleteBehavior.ClientSetNull)
                    .HasConstraintName("film_actor_actor");

                entity.HasOne(d => d.Film)
                    .WithMany(p => p.FilmActor)
                    .HasForeignKey(d => d.FilmId)
                    .OnDelete(DeleteBehavior.ClientSetNull)
                    .HasConstraintName("film_actor_film");
            });

Возможно, я где-то не правильно использую эту модель?

РАЗРЕШЕНИЕ

После большой помощи, приведенной ниже, я смог выполнить исправление, просто создав цикл, который прошел через связанную таблицу film_actor и удалил все строки с ActorId , который был связан с Актер удаляется. Вот быстрый цикл, который я вставил перед выполнением метода SaveChanges():

foreach (var tatertot in MoviesContext.Instance.FilmActors) {
     if(tatertot.ActorId == actorId) {
          MoviesContext.Instance.FilmActors.Remove(tatertot);
     }
}

Я хотел бы поблагодарить всех за помощь. Я уверен, что у меня будет больше, поскольку этот класс продолжается! Спасибо. :)

1 Ответ

0 голосов
/ 29 августа 2018

Это жизненно важная информация:

Невозможно удалить или обновить родительскую строку: сбой ограничения внешнего ключа (movies.film_actor, CONSTRAINT film_actor_actor FOREIGN KEY (ActorId) ССЫЛКИ actor (actorid).

Если я правильно читаю детали, это означает, что в столбце film_actor_actor в movies.film_actor есть значение, указывающее на идентификатор (в столбце ActorId) актера, которого вы пытаетесь удалить.

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

Решение: Вам нужно удалить все и все ссылки на строку актера, прежде чем вы сможете удалить саму строку актера.

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