Ich weiß also, dass EF-Entities ihre eigenen Änderungen verfolgen und sie in der Datenbank beibehalten, wenn savechanges aufgerufen wird, aber was ist mit diesem Szenario ...
Ich habe eine Seite, die einen Blogbeitrag bearbeiten soll. Es hat zwei Aktionsmethoden.
%Vor%Hier ist die Ansicht, dass diese zurückgeben:
%Vor%Ich bin hier ein wenig verwirrt. Hinzufügen von Blog-Posts scheint gut zu funktionieren, aber die Bearbeitung von ihnen ist eine andere Geschichte.
Die Lösung besteht nicht darin, das Blog-Post-Objekt in Ihrer Edit-Aktionsmethode aufzunehmen. Tun Sie stattdessen etwas, das wie folgt aussieht:
%Vor% Auf diese Weise wird das Objekt an den Kontext angehängt und der EF kann Änderungen korrekt verfolgen. Die UpdateModel
-Methode ist eine Zeitersparnis, die Felder in der Formularsammlung automatisch mit den Feldern im Modell abgleicht und für Sie aktualisiert.
Hier ist die Dokumentation für UpdateModel
:
MSDN
Entity Framework kann nur Änderungen an Objekten verfolgen, die an einen Kontext gebunden sind. Objekte, die von einem Kontext erzeugt werden, werden automatisch an den Kontext angehängt, der sie erzeugt. Da das Objekt, das Sie erhalten, von MVC erstellt wird, weiß das Entity Framework nicht, welche Werte aktualisiert wurden und welche nicht.
Es gibt ein paar Tricks, mit denen Sie Entity Framework mitteilen können, dass das Element geändert wurde. Eine besteht darin, die Entität aus dem Kontext abzurufen, die geänderten Werte für dieses kontextgebundene Objekt festzulegen und dann Ihre Änderungen zu speichern. Eine andere Möglichkeit besteht darin, den ObjectStateManager des Kontexts explizit anzugeben, dass bestimmte Eigenschaften geändert wurden:
%Vor%Mein Team hat am Ende ein Framework entwickelt, das das Objekt automatisch aus dem Kontext lädt, herausfindet, welche Eigenschaften sich von der neuen unterscheiden, und die diese Eigenschaften auf die vom nicht angefügten Objekt bereitgestellten Werte setzt. Dieser Ansatz könnte sich auch für Sie lohnen. Es gibt eine leichte Möglichkeit, dass etwas wie AutoMapper dafür gemacht werden könnte, aber ich bin mir nicht sicher.
Bearbeiten
Shea erwähnt die Verwendung der UpdateModel
-Methode des Controllers, um die Einstellung der Eigenschaftswerte so lange hinauszuzögern, bis Sie das Entitätsobjekt aus Ihrem Kontext abgerufen haben. Das klingt für mich nach einem guten Ansatz (vorausgesetzt, Sie haben mit dem Zugriffscode auf Ihrem Controller Recht), aber Sie können eine Überschreibung verwenden, um die Methode so zu binden, dass sie immer noch an dieselbe gebunden ist Objekttyp:
Tags und Links asp.net-mvc c# entity-framework asp.net-mvc-2 entity-framework-4