Как установить значение внешнего ключа равным нулю при удалении дочерней записи EF Core

#c# #sql-server #entity-framework-core #ef-code-first

#c# #sql-сервер #entity-framework-core #ef-code-first

Вопрос:

Я новичок в Entity Framework, и у меня есть API, который может удалять записи из базы данных SQL Server, у меня есть дочерняя таблица ResidenceType , и я могу удалить строку, используя идентификатор, у меня есть родительская таблица PropertyGroups с внешним ключом ResidenceTypeId . Есть ли способ, которым я могу установить значение внешнего ключа NULL при удалении строки, ResidenceType которая связана?

Таблица типа места жительства

Данные типа резидентности

Таблица групп свойств

Свойство группирует данные

Итак, поведение, которое мне нужно, заключается в том, что если я удаляю идентификатор 1 из ResidenceType таблицы, мне нужно, чтобы ядро EF установило ResidenceTypeId столбец в PropertyGroups значение NULL (или пустой). Я пробовал переопределить OnModelCreating метод в своем DataContext классе, но мне не очень повезло, буду признателен за любой совет или помощь.

Ответ №1:

В классе Dbcontext установлен OnDelete

 modelBuilder.Entity<Land>()
            .HasOne(l => l.Building)
            .WithMany(b => b.Lands)
            .HasForeignKey(l => l.BuildingId)
            .OnDelete(Microsoft.EntityFrameworkCore.Metadata.DeleteBehavior.SetNull);
 

Ответ №2:

Во-первых, убедитесь, если еще нет, что FK_PropertyGroups_ResidenceTypes_ResidenceTypeId допускает значение NULL, а затем при удалении ResidenceType вам просто нужно будет выпустить update , до SaveChanges вы могли бы использовать каждую группу свойств для обновления значения FK до null…Я думаю, это сработало бы … но искали ли вы решение, как внести изменения или как такое поведение будет разрешено, поэтому убедитесь, что FK допускает нули, и в этом случае предыдущее решение является ответом.

Ответ №3:

Оказывается, я все настроил правильно, мне просто нужно было добавить предложение Include в метод удаления.

 var residenceType = await _context.ResidenceTypes.Include(p => p.PropertyGroups).FirstOrDefaultAsync(i => i.PropertyGroupName == name);
 

Добавление этого значения приводит к тому, что соответствующий столбец идентификатора становится нулевым, благодаря людям, которые пытались помочь.