Frage

Ich werde versuchen, so klar wie möglich zu sein:

Mein Ziel: Die Modellkonfiguration zu lesen, die ich in meinem überschriebenen erklärt habe OnModelCreating In meiner Entitätsklasse abgeleitet von DbContext.

Grund: Einen generische Bau void Update<T>(T toUpdate) Methode auf meiner Datenschicht, in der ich erhalte, welche Felder der Hauptschlüssel für T sind, rufen Sie sie auf dem übergeben ab toUpdate Objekt und verwenden Sie sie in der Set<T>().Find Methode.

Dies würde es mir ermöglichen, für jede Art von Entität, die ich verarbeite, keine Hardcode zu finden.

Ich muss die gespeicherte Entität abrufen, um Updates wie folgt anzuwenden:

var retrievedItem = _entities.Set<T>().Find(myRetrievedKeyValues);
_entities.Entry(retrievedItem).CurrentValues.SetValues(toUpdate);

Ich stecke an dem Punkt fest, an dem in meinem _entities Instanz (die meine Entitäten Klasse ist, aus der abgeleitet ist DbContext Natürlich) Ich kann nicht herausfinden, wo die Modellkonfiguration gespeichert ist.

Kann mich jemand in die richtige Richtung verweisen?

Vielen Dank.

War es hilfreich?

Lösung

Sie finden den Code, wie Sie die wichtigsten Eigenschaftennamen eines Entitätstyps abrufen YourEntity hier:

Entity Framework Code zuerst. Primärschlüssel finden

Und dann die Werte abrufen:

public Update<T>(T toUpdate)
{
    // Code from link above with YourEntity = T

    List<object> myRetrievedKeyValues = new List<object>();
    foreach (var keyName in keyNames)
        myRetrievedKeyValues.Add(toUpdate.GetType().GetProperty(keyName)
            .GetValue(toUpdate, null));

    var retrievedItem = _entities.Set<T>().Find(myRetrievedKeyValues.ToArray());
    _entities.Entry(retrievedItem).CurrentValues.SetValues(toUpdate);
}

Erwarten Sie, dass Sie ziemlich langsam haben werden Update Methode, da Sie Reflexion für diesen generischen Ansatz verwenden müssen.

Vergiss das auch nicht CurrentValues.SetValues Aktualisiert nur skalare und komplexe Eigenschaften. Es hilft Ihnen nicht, die Navigationseigenschaften zu aktualisieren. Sie müssen nicht generischen Code verwenden, um die Beziehungen zu aktualisieren, die für jeden Entitätstyp spezifisch sind.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top