Ошибка при обновлении дочерней записи EF Core 3.0 Связь между сущностями была разорвана, но связь либо помечена как «Обязательная».

Я использую EF Core версии: 3.0 Поставщик базы данных: Microsoft.EntityFrameworkCore.SqlServer

У меня есть две таблицы: PROFILO (мастер) и PROFILOTITOLODISTUDIO (подробности) это модель:

МОДЕЛЬ ПРОФИЛО

 public partial class Profilo
{
    public Profilo()
    {
        ProfiloTitoloDiStudio = new List<ProfiloTitoloDiStudio>();
    }

    [Key]
    public Guid IdProfilo { get; set; }
    [Required]
    [StringLength(256)]
    public string Nome { get; set; }
    [StringLength(256)]
    public string Cognome { get; set; }

    [InverseProperty("IdProfiloNavigation")]
    public virtual IList<ProfiloTitoloDiStudio> ProfiloTitoloDiStudio { get; set; }
}

МОДЕЛЬ ПРОФИЛОТИТОЛОДИСТУДИО

public partial class ProfiloTitoloDiStudio
{
    [Key]
    public int IdProfiloTitoloDiStudio { get; set; }
    public Guid IdProfilo { get; set; }
    [Required]
    [StringLength(256)]
    public string DenominazioneCorsoStudio { get; set; }
    [ForeignKey(nameof(IdProfilo))]
    [InverseProperty(nameof(Profilo.ProfiloTitoloDiStudio))]
    public virtual Profilo IdProfiloNavigation { get; set; }
}

Внешний ключ IdProfilo в таблице PROFILOTITOLODISTUDIO должен быть НЕ ПУСТОЙ

В действии контроллера Edit я получаю объект с полями, ограниченными представлением, в качестве входных данных, даже если я не изменяю никакого значения, savechanges () всегда возвращает ошибку:

InvalidOperationException: связь между сущностями «Profilo» и «ProfiloTitoloDiStudio» со значением ключа «{IdProfilo: 45c42779-39b6-4047-91d1-12253a79b7f6}» разорвана, но связь либо помечена как «Требуется», либо неявно требуется, поскольку внешний ключ не допускает значения NULL. Если зависимая / дочерняя сущность должна быть удалена при разрыве требуемой связи, настройте связь для использования каскадного удаления.

это код сохранения:

public async Task<IActionResult> Edit(Profilo profiloinput)
    {


            var _profiloDB = await _dbcontext.Profilo
                                               .Include(p => p.ProfiloTitoloDiStudio)
                                               .SingleOrDefaultAsync(p => p.IdProfilo == profiloinput.IdProfilo);

            _profiloDB.Nome = profiloinput.Nome;
            _profiloDB.Cognome = profiloinput.Cognome;


            _profiloDB.ProfiloTitoloDiStudio = profiloinput.ProfiloTitoloDiStudio;


            var x = await _dbcontext.SaveChangesAsync();


    }

Я не нарушаю никаких отношений между PROFILE и PROFILOTITOLODISTUDIO. Я просто пытаюсь обновить дочернюю таблицу , внешний ключ IDPROFILO в объекте профиля. ProfiloTitoloDiStudio полностью улучшен !!!


person gemon01    schedule 15.04.2020    source источник


Ответы (1)


Я решил, в некоторых сообщениях сообщалось об этом решении, но это было не очень ясно, проблема возникает из-за настройки связи между двумя таблицами, настройки, установленной в классе DbContext:

public partial class MyDbContext : DbContext

это затронутая часть кода: ПЕРЕД

        modelBuilder.Entity<ProfiloTitoloDiStudio>(entity =>
        {
            entity.HasKey(e => e.IdProfiloTitoloDiStudio)
                .HasName("PK_TitoloDiStudio");

            entity.HasOne(d => d.IdProfiloNavigation)
                .WithMany(p => p.ProfiloTitoloDiStudio)
                .HasForeignKey(d => d.IdProfilo)
                .OnDelete(DeleteBehavior.ClientSetNull)
                .HasConstraintName("FK_ProfiloTitoloDiStudio_Profilo");

        });

это после изменения:

        modelBuilder.Entity<ProfiloTitoloDiStudio>(entity =>
        {
            entity.HasKey(e => e.IdProfiloTitoloDiStudio)
                .HasName("PK_TitoloDiStudio");

            entity.HasOne(d => d.IdProfiloNavigation)
                .WithMany(p => p.ProfiloTitoloDiStudio)
                .HasForeignKey(d => d.IdProfilo)
                /*.OnDelete(DeleteBehavior.ClientSetNull)*/
                .HasConstraintName("FK_ProfiloTitoloDiStudio_Profilo");

        });

на практике параметр отношения .OnDelete был изменен с DeleteBehavior.ClientSetNull на DeleteBehavior.Cascade, который затем быть настройкой по умолчанию, поэтому я удалил ее.

Моя трудность в том, что класс MyDbContext был сгенерирован Scaffold-DbContext (DatabaseFirst), поэтому я предпочитаю не изменять его, поэтому я изменил отношение непосредственно в базе данных и заставил Scaffold-DbContext развернуться !!!

это изменение в БД

tx в BombaAnarchica

person gemon01    schedule 15.04.2020