Ich habe das folgende Verhalten bemerkt und ich frage mich, ob irgendjemand erklären kann, warum es passiert und wie es verhindert werden kann.
In meinen partiellen Klassen habe ich verschiedene schreibgeschützte Eigenschaften hinzugefügt, die in der Datenbank nicht vorhanden sind. Wenn das Objekt erstellt wird, wird auf diese Eigenschaften zugegriffen, bevor wir zur Create-Methode des Controllers gelangen. Auf Eigenschaften, die mit nur get; set;
deklariert wurden, wird jedoch nicht zugegriffen.
Um mit sehr einfachen Beispielen zu arbeiten, wenn ich folgende Eigenschaften habe:
%Vor%Wenn ich dann Haltepunkte auf die Eigenschaften setze, wird beim Erstellen des Objekts der Haltepunkt für die erste Eigenschaft, aber nicht für die zweite Eigenschaft getroffen. Wenn ich jedoch eine Methode habe:
%Vor%dann wird nicht darauf zugegriffen.
Ich habe alle möglichen Variationen und Anmerkungen versucht
%Vor% Ich habe versucht, die Eigenschaften virtual
zu deklarieren, aber auf alle Variationen, außer der get; set;
-Vielfalt, wird zugegriffen, wenn das Objekt erstellt wird. Dieses Verhalten tritt auch bei Integer-Eigenschaften auf
und Datum / Uhrzeit-Eigenschaften,
%Vor%, aber nicht für String-Eigenschaften
%Vor%oder andere Entitätseigenschaften
%Vor%Das Problem, das ich habe, ist, dass einige dieser Eigenschaften eine Logik beinhalten können, die Datenbankzugriffe benötigen könnte, zB
%Vor%was die Entität zum Zeitpunkt der Erstellung nicht haben wird.
Offensichtlich kann ich das umgehen, indem ich alles zu einer Methode mache, aber es würde mich interessieren, warum ASP.NET MVC auf diese Eigenschaften bei der Objekterstellung zugreift (eine Art interne Validierung vielleicht), und ich würde gerne wissen, ob es gibt irgendwelche Methoden, dies zu verhindern, möglicherweise durch eine Anmerkung, auf die ich nicht gestoßen bin.
Mein Projekt ist die Datenbank zuerst, C #, EF 4.1, MVC
Bearbeiten
Ich sollte auch darauf hinweisen, dass ich POCO-Entitäten verwende und über gespeicherte Prozeduren / Funktionsimporte auf die Datenbank zugreife.
Ein Gedanke ist mir aufgefallen, dass auf diese Eigenschaften als Teil des Change-Tracking-Systems zugegriffen wird, wie in hier . Es scheint, dass wahrscheinlich ein Schnappschuss von dem neu erstellten Gegenstand gemacht wird. Ich habe versucht, die Proxy-Erstellung auszuschalten
%Vor%aber die Eigenschaften werden immer noch bei der Erstellung aufgerufen.
Bearbeiten 20130322
Folgend @ ladislavmrnkas Vorschlag, die Stack-Spur zu untersuchen, habe ich Folgendes:
%Vor%Darin werden Sie die Anrufe zu einem oder zwei Validatoren bemerken. Als Test habe ich meine bool-Eigenschaft in eine nullable bool-Eigenschaft geändert:
%Vor%Diesmal wurde beim Erstellen des Objekts nicht auf die Eigenschaft zugegriffen. Dies ist mein gewünschtes Verhalten. Ich möchte jedoch nicht alle meine benutzerdefinierten Eigenschaften ändern müssen, damit sie nullfähig sind. Daher wird meine Frage jetzt ...
Gibt es eine Möglichkeit, dem Framework mitzuteilen, dass eine Eigenschaft nicht validiert werden soll? Vielleicht über ein Attribut. Diese Antwort beantwortet fast die Frage, aber da ich zuerst die Datenbank verwende, scheint mir kein ValidateOnSaveEnabled
Eigenschaft zum Ausschalten. Vielleicht muss ich meine Modelle noch einmal besuchen.
Wie bei den meisten EF-Problemen liegt die Antwort bei Ansichtsmodellen.
Da die meisten der Eigenschaften, auf die zugegriffen wurde, erst relevant waren, als das Modell erstellt und in der db gespeichert wurde, erstellte ich ein Ansichtsmodell speziell für die Ansicht Create, das nur die absolute Mindestanzahl von Eigenschaften enthielt, die zum Erstellen der Modell. Ich habe die Create-Methode des Controllers geändert, um mein neues Ansichtsmodell zu akzeptieren, und voila, beim Erstellen dieses neuen Modells gab es keine Zugriffe auf irrelevante Eigenschaften des Hauptmodells.
Die Antwort auf meine ursprüngliche Frage scheint also zu sein, dass das Entitätsframework eine Validierung für alle nicht nullbaren Skalareigenschaften durchführt, wenn ein Objekt erstellt wird, und eine Möglichkeit, dies zu vermeiden, ist wie oben erklärt.
Tags und Links asp.net-mvc c# entity-framework