Нужна помощь здесь ... Я копирую код непосредственно из одного из моих школьных классов, и они показывают результат в своем коде, но каждый раз, когда я запускаю его, я получаю следующую ошибку исключения:
Исключение произошло:
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);
}
}
Я хотел бы поблагодарить всех за помощь. Я уверен, что у меня будет больше, поскольку этот класс продолжается! Спасибо. :)