Zasadniczo mam model np

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

Próbowałem zrobić coś takiego:

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();

Niestety tak naprawdę to nie działa

Instrukcja DELETE kolidowała z ograniczeniem REFERENCE „FK_Cars_Dealer_DealerId”. Konflikt wystąpił w bazie danych „Test”, tabeli „dbo.Cars”, kolumnie „DealerId”.

Jakieś pomysły, jak wykonać usuwanie z relacjami bez płynnej konfiguracji?

[Kaskadowe usuwanie] atr.

Wygląda na to, że nie ma go w EF Core

1
Joelty 7 listopad 2018, 11:29

1 odpowiedź

Najlepsza odpowiedź

Odpowiedź brzmi – nie, nie jest to możliwe, ponieważ jest to typowe zachowanie dla tego typu modelu (Kaskadowe usuwanie dla opcjonalnych relacji), a gdy konwencjonalne zachowania nie działają dla Ciebie, powinieneś je zastąpić adnotacjami danych / interfejsem Fluent API. Ponieważ zachowanie usuwania kaskadowego można określić tylko za pomocą interfejsu API Fluent, musisz użyć konfiguracji Fluent.

Byłoby inaczej, gdyby twoja relacja była wymagane, np. Car mający wyraźne *nie null& FK public Guid DealerId { get; set; }, ale wtedy pytanie brzmi: czy możesz wyłączyć usuwanie kaskadowe, a odpowiedź będzie taka sama.

Krótko mówiąc, użyj konfiguracji Fluent, to tylko jeden z przypadków, w których istnieją adnotacje danych / Fluent API. Minimum to

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

I nie zapomnij o wygenerowaniu nowej migracji i aktualizacji bazy danych.

2
Ivan Stoev 7 listopad 2018, 12:05