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 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.
Podobne pytania
Nowe pytania
c#
C # (wymawiane „patrz ostro”) jest językiem programowania wysokiego poziomu, statycznie typowanym, wieloparadygmatowym opracowanym przez firmę Microsoft. Kod C # zwykle jest przeznaczony dla rodziny narzędzi Microsoft .NET i czasów wykonywania, do których należą między innymi .NET Framework, .NET Core i Xamarin. Użyj tego tagu w przypadku pytań dotyczących kodu napisanego w C # lub C # formalnej specyfikacji.