Можно ли выполнить каскадное удаление без быстрой настройки в onModelCreating? - PullRequest
0 голосов
/ 07 ноября 2018

В основном у меня есть модель, например,

public class Dealer
{
    [Key]
    public Guid Id { get; set; }
    public List<Car> Cars { get; set; } = new List<Car>();
}

public class Car
{
    [Key]
    public Guid Id { get; set; }
    public string Model { get; set; }
}

Я пытался сделать что-то вроде этого:

var dealer = _context.Dealers.FirstOrDefault(x => x.Id == Id);

foreach (var car in dealers.Cars)
{
    _context.Cars.Remove(car);
    // _context.Entry(car).State = EntityState.Deleted;
}

dealer.Cars.Clear();

_context.Dealers.Remove(dealer);
_context.SaveChanges();

К сожалению, это на самом деле не работает

Оператор DELETE конфликтует с ограничением REFERENCE "FK_Cars_Dealer_DealerId". Конфликт произошел в базе данных «Тест», таблице «dbo.Cars», столбце «DealerId».

Любые идеи о том, как выполнить удаление с отношениями без свободного конфигурации?

[CascadeDelete] attr.

Похоже, его нет в EF Core

1 Ответ

0 голосов
/ 07 ноября 2018

Ответ - нет, это невозможно, потому что это обычное поведение для этого типа модели ( Каскадное удаление для необязательных отношений ), и когда обычные поведения не работают для вас, вы должны переопределить их с аннотациями данных / свободно API. Поскольку поведение каскадного удаления может быть задано только с помощью свободного API, вы должны использовать свободную конфигурацию.

Было бы иначе, если бы ваши отношения были обязательны , например Car с явным * не обнуляемым & FK public Guid DealerId { get; set; }, но тогда возникает вопрос, можете ли вы отключить каскадное удаление, и ответ будет таким же.

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

modelBuilder.Entity<Dealer>().HasMany(e => e.Cars).WithOne()
    .OnDelete(DeleteBehavior.Cascade);

И не забудьте создать новую миграцию и обновить базу данных.

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