Was ist der Unterschied zwischen diesen beiden Aussagen?
Beide sollten eine Entität löschen.
_context.Entry(new Schoolyear { Id = schoolyearId }).State = EntityState.Deleted;
_context.Schoolyears.Remove(new Schoolyear { Id = schoolyearId });
und für diejenigen, die die EF Extensions nicht kennen:
_context.Schoolyears.Delete(s => s.Id == schoolyearId);
Das ist noch cooler: D
Sie sind gleich, aber beide werden scheitern. EF verwendet intern einen ObjectManager, um alle von EF verwendeten Elemente zu verfolgen. Einträge zum _context.Schoolyears.Add(obj)
mithilfe von _context.Schoolyears.Add(obj)
von EF oder durch Hinzufügen neuer Einträge zur EF mit _context.Schoolyears.Add(obj)
.
Beim Verweisen auf Einträge, die nicht im Objektmanager gespeichert sind, werden normalerweise InvalidOperationException
Ausnahmen erstellt. Das Verhalten von Folgendem ist ähnlich:
Schoolyear year = context.Schoolyears.Single(x => x.Name == "2013");
_context.Schoolyears.Remove(year);
_context.SaveChanges();
oder
Schoolyear year = context.Schoolyears.Single(x => x.Name == "2013");
_context.Entry(year).State = EntityState.Deleted;
_context.SaveChanges();
EF führt jedoch im ersten Ansatz einige weitere Überprüfungen und Aktivitäten zur Statusänderung durch.
Ich würde immer den ersten Ansatz vorziehen, wenn möglich.
Auf der anderen Seite des Spiels gibt es EntityFramework.Extended . Diese Bibliothek ermöglicht Massenaktualisierungen / -löschungen in EF-Kontexten.
Diese Bibliothek verwendet den ObjectManager nicht, daher dürfen Sie diesen verwenden
_context.Schoolyears.Delete(s => s.Id == schoolyearId);
Hinweis: Sie können auch verwenden (bevorzugt)
_context.Schoolyears.Where(s => s.Id == schoolyearId).Delete();
Warnung : Stellen Sie sicher, dass Sie Objekte in EF und EF.Extended nicht gleichzeitig bearbeiten. Dies kann zu unvorhersehbaren Ergebnissen oder Ausnahmen führen.