Удаление EF Core из таблицы нарушает ограничение внешнего ключа для таблицы - PullRequest
0 голосов
/ 25 октября 2018

У меня есть две таблицы (Device и PropertyValue), и когда я пытаюсь удалить Device, я получаю исключение:

нарушает внешний ключ

Я также попытался установить каскад на OnModelCreating(), но все еще не работает.

public class Device
{
    public int Id { get; set; }
    public List<PropertyValue> Properties { get; set; }
}

public class PropertyValue
{
    public int Id { get; set; }
    public int? DeviceId { get; set; }
    public Device Device { get; set; }
}

modelBuilder.Entity<PropertyValue>()
    .HasOne(p => p.Device)
    .WithMany(b => b.Properties)
    .HasForeignKey(w => w.DeviceId)
    .OnDelete(DeleteBehavior.Cascade);  

РЕДАКТИРОВАТЬ : я использую репозиторий, но в основном я удаляю, используя _context.Devices.Remove(entity);

Ответы [ 3 ]

0 голосов
/ 25 октября 2018

Если связанные объекты в коллекции Properties не загружены и не отслежены контекстом, они не будут удалены.Рекомендуемый подход состоит в том, чтобы установить каскадное действие для ограничения внешнего ключа в базе данных, как описано в документации для DeleteBehavior:

https://docs.microsoft.com/en-us/ef/core/api/microsoft.entityframeworkcore.metadata.deletebehavior

Если вы создаете схему автоматически сEF, это также то, что будет сгенерировано.

0 голосов
/ 25 октября 2018

Поскольку свойство FK DeviceId имеет значение NULL, отношение равно необязательно , которое по по умолчанию отключило каскад удаления.

Таким образом, добавление .OnDelete(DeleteBehavior.Cascade)шаг в правильном направлении.

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

0 голосов
/ 25 октября 2018

Строка

public int? DeviceId { get; set; } 

определяет имя свойства DeviceId, и это свойство допускает нулевое значение.Попробуйте удалить из этого символ ? и удалить часть .HasForeignKey(w => w.DeviceId).Это должно работать.

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