2 Stimmen

EntityFramework's Version von Activerecord's Callbacks und NamedScope

Problem: In meinem Modell muss ich Rückrufe verwenden, um das DB-Entitätsobjekt zu verarbeiten, bevor ein ORM-Ereignis ausgelöst wird. Außerdem suche ich nach einer Möglichkeit, eine benannter Bereich damit ich nicht für jede Abfrage bestimmte Bedingungen angeben muss. Wenn ich zum Beispiel Find on dbcontext object für Items verwende, sollte ich nicht bei jedem Aufruf active = true angeben müssen.

Fragen:

  1. Gibt es etwas Vergleichbares zu Callbacks Methoden von ActiveRecord in ASP.NET MVC (EntityFramework)? Zum Beispiel: after_save, before_save, after_create, before_create, after_validation, before_validation etc.

  2. Sollte ich eine "Modellansicht" erstellen, um jede Abfrage mit zwingenden Bedingungen zu versehen? Bitte stellen Sie ein Beispiel oder eine Ressource/ein Tutorial zur Verfügung.

6voto

Ladislav Mrnka Punkte 355028

Nein. Es sind keine solchen Ereignisse/Rückrufe verfügbar. EF ObjectContext bietet nur ObjectMaterialized y SavingChanges Veranstaltungen. Das erste kann verwendet werden, um zu reagieren, wenn die Entität aus der Datenbank materialisiert (geladen) wird, und das zweite kann verwendet werden, um alles vor dem Speichern von Änderungen zu behandeln (es ist ähnlich wie das Überschreiben von SaveChanges Methode).

Beispiel:

public void SavingChanges(object sender, EventArgs e)
{
    ObjectContext context = (ObjectContext)sender; 

    var entities = context.ObjectStateManager
                          .GetObjectStateEntries(EntityState.Added)
                          .Where(e => !e.IsRelationship)
                          .Select(e => e.Entity)
                          .OfType<MyEntity>();

    // Now you have all entities of type MyEntity which will be added
    // You can use similar approach for other type of entities or
    // modified entities or deleted entities                      
}

EF bietet keine globalen Bedingungen / named-scopes an. Sie müssen immer darauf achten, dass Ihre Abfrage alle Bedingungen enthält. Sie können zum Beispiel eine benutzerdefinierte Erweiterungsmethode erstellen und anstelle der Standard-Suche diese Erweiterungsmethode verwenden, die alle Ihre zusätzlichen Bedingungen hinzufügt

Beispiel:

public static MyEntity FindWithCondition(this IQueryable<MyEntity> query, int id)
{
    return query.Where(...).FirstOrDefault(e => e.Id == id);
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X