Ошибка в обновлении дочерней записи EF Core 3.0 Связь между сущностями разорвана, но связь помечена как «Обязательная» - PullRequest
0 голосов
/ 15 апреля 2020

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

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

PROFILO MODEL

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

PROFILOTITOLODISTUDIO MODEL

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 должен иметь значение NOT NULL

В действии контроллера 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();


    }

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

1 Ответ

0 голосов
/ 15 апреля 2020

Я решил, в некоторых сообщениях об этом решении сообщалось, но оно было не очень ясным, проблема возникает из-за установки отношения между двумя таблицами, установки, установленной в классе 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 развернуться !!!

this is the change on the DB

tx до BombaAnarchica

...