Grundlegendes zum Standardverhalten von Entity Framework: Persistenz untergeordneter Objekte
Bei der Nutzung von Entity Framework (EF), einem weit verbreiteten objektrelationalen Mapping (ORM )-Framework für .NET ist es wichtig, sich seines Verhaltens in Bezug auf untergeordnete Entitäten bewusst zu sein. Standardmäßig geht EF davon aus, dass beim Speichern einer Entität alle zugehörigen untergeordneten Objekte neben ihr gespeichert werden sollten. Diese Standardaktion kann jedoch zu unerwünschten Konsequenzen führen, insbesondere wenn Sie beabsichtigen, die Persistenz untergeordneter Entitäten zu überspringen.
Gründe für den Ausschluss untergeordneter Entitäten von der Persistenz
Es können Szenarien auftreten wo das Speichern untergeordneter Entitäten unerwünscht ist. Wenn beispielsweise Daten manuell aus externen Quellen wie Flatfiles eingefüllt werden, erfüllen möglicherweise vorhandene Entitäten in der Datenbank bereits die Rollen der untergeordneten Entitäten. Das Einfügen von Duplikaten in die Datenbank kann zu Inkonsistenz- und Integritätsproblemen führen. Darüber hinaus kann das Speichern untergeordneter Entitäten vor der Zuweisung eines Primärschlüssels den ordnungsgemäßen Betrieb von EF beeinträchtigen.
Selektive Persistenz erzwingen: Unveränderter EntityState
Um die Herausforderung zu bewältigen, die Persistenz untergeordneter Entitäten zu überspringen können Sie die Option EntityState.Unchanged nutzen. Indem Sie den Status einer untergeordneten Entität explizit auf „Unverändert“ festlegen, weisen Sie EF an, ihn während des Speichervorgangs zu ignorieren.
Codebeispiel mit EntityState.Unchanged
Bedenken Sie Folgendes Codebeispiel, vorausgesetzt, Sie haben eine Schulentität mit einer untergeordneten Stadtentität:
public School Insert(School newItem) { using (var context = new DatabaseContext()) { context.Set<School>().Add(newItem); context.Entry(newItem.City).State = EntityState.Unchanged; context.SaveChanges(); return newItem; } }
Indem Sie den Status der Stadtentität auf festlegen Unverändert schließt EF es vom Speichervorgang aus, sodass die Datenbank unverändert bleibt. Dieser Ansatz erfordert jedoch eine manuelle Handhabung der Zuweisung untergeordneter Entitäten.
Alternative Lösung: Verwendung von Fremdschlüsseln
Eine elegantere und flexiblere Lösung besteht in der Verwendung von Fremdschlüsseln. Durch die Definition einer Fremdschlüsseleigenschaft innerhalb Ihrer untergeordneten Entität geben Sie explizit deren Beziehung zur übergeordneten Entität an. EF verarbeitet dann automatisch den Status der zugehörigen Entität basierend auf der bereitgestellten Referenz.
Codebeispiel mit Fremdschlüsseln
Hier ist eine aktualisierte Version des vorherigen Codebeispiels mit Fremdschlüsseln :
public class School { public int Id { get; set; } public string Name { get; set; } [ForeignKey("City_Id")] public City City { get; set; } [Required] public int City_Id { get; set; } } public School Insert(School newItem, int cityId) { using (var context = new DatabaseContext()) { // Set child entity to null to prevent insertion newItem.City = null; // Specify foreign key relationship without adding the child entity newItem.City_Id = cityId; context.Set<School>().Add(newItem); context.SaveChanges(); return newItem; } }
In diesem Fall legen Sie die City_Id manuell fest und machen die City-Referenz ungültig, wodurch Sie EF anweisen, die Verbindung über das Ausland herzustellen Schlüssel, ohne die untergeordnete Entität einzubeziehen. Dieser Ansatz vereinfacht den Code und vermeidet die Notwendigkeit, EntityState manuell zu verwalten.
Fazit
Wenn Entwickler das Standardverhalten von Entity Framework verstehen und die entsprechenden Techniken wie EntityState.Unchanged oder die Verwendung von Fremdschlüsseln verwenden, können sie die Persistenz untergeordneter Entitäten steuern und anpassen, unerwünschte Nebenwirkungen verhindern und die Datenintegrität in ihren Anwendungen sicherstellen.
Das obige ist der detaillierte Inhalt vonWie kann ich die Persistenz untergeordneter Entitäten im Entity Framework steuern?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!