Wie Sie verhindern, dass EF Validierung von Eigenschaften, die nicht zugeordnet werden während der DBContext.SaveChanges()
Habe ich ein Benutzer-Modell mit zwei [NotMapped] string-Eigenschaften-Kennwort und ConfirmPassword. Diese sind unsichtbar, weil ich Kennwort speichern als byte-array (die nach dem Salzen), so gibt es zwei zusätzliche Eigenschaften (abgebildet) InternalPassword und Salz im Benutzer-Modell.
Das problem ist, wenn ich das user-Modell-Passwort zu ändern, entity framework wirft DBEntityValidation Fehlermeldung "Das Kennwort ist erforderlich." Was ich verstehe ist hier, dass die EF wird versuchen, zu validieren, das Modell vor dem speichern und da Passwort/ConfirmPassword sind nicht festgelegt, es wirft diese Fehlermeldung. Dies wirft folgende Fragen auf:
1) Wenn das Eigentum Passwort ist explizit annitated als [NotMapped], warum ist EF-es überprüft beim speichern?
2) WENN EF führt eine Validierung beim speichern, und das gleiche wird auch durchgeführt, während die Bindung (I. E. in der controller-action-Methode), tut es nicht weh performance? (die Validierung zweimal)
3) Was ist der empfohlene Weg, um diesen Fehler zu beheben? (Wenn ich explizit festlegen, Password-Eigenschaft, um dummy-Wert, Fehler ist Weg.)
Edit: ich habe entfernt den code, da ist es langwierig und kann die Ursache keine Antwort noch. Wenn jemand will, um einen Blick zu haben, kann ich anfügen, unten.
- Das ist komisch, denn auch wenn die
Password
Eigenschaft zugeordnet wird, wäre es nicht erforderlich, die standardmäßig seitstring
Eigenschaften sind nicht erforderlich, es sei denn, Sie geben diese explizit - putting[Required]
- Attribut für die Eigenschaft oder das aufrufen vonIsRequired()
im Fluent-API. Haben Sie beispielsweise die Einstellungen für diePassword
Eigenschaft? - ja, ich habe required-Attribut angegebene Passwort. Dies ist nötig, um den Benutzer fragt, füllen Sie das Passwort-Feld bei der Registrierung. Aber da dieses nicht belegt, warum die EF zu überprüfen versucht, es während dem speichern?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Automatische Validierung in EF ist irgendwie seltsam feature - ich mag es nicht. Sie können Lesen dieser Artikel Informationen zu finden, wie überprüft wird, nur ausgewählte Eigenschaften, aber ich erwarte, dass Sie ausgelöst werden müssen, dass die überprüfung manuell an und ausschalten Globale Validierung durch den Aufruf:
Ihr problem mit
NonMappedAttribute
ist interessant. Ich wollte nicht gehen Sie tief in die Durchführung der Validierung in EFv4.1 wenn aber die Umsetzung ist um den gleichen Vorschriften wie die gemeinsame Validierung basiert auf Daten, Anmerkungen, es verwendet nur Attribute abgeleitet vonValidationAttribute
-NotMappedAttribute
ist nicht abgeleitet vonValidationAttribute
.Dass ist ein weiteres problem einer solchen Umsetzung - es verbindet die mapping-definition und Validierung, aber diese beiden features sind nicht das gleiche und sollte nicht umgesetzt werden, durch die gleiche API.
@alun gelöscht, seine Antwort - eine gültige Antwort auf Ihre Frage. Ihre überprüfung gehört zum view-model-abhängig von der operation, die ein Benutzer durchführt. Es gehört nicht zu Persistenz Modell. Warum? Genau, weil das aktuelle Problem - persistence-Modell kann halt nur single-Validierung setzen, und jede operation in Ihrer Anwendung sicherstellen müssen, dass die Validierung von Kriterien für den Satz erfüllt sind = Sie müssen sicherstellen, dass
Password
undConfirmPassword
gefüllt sind, auch wenn Ihre aktuelle operation nicht verlangen, es => problem.Alten thread, aber da ich Stand vor dem exakt gleichen Problem mit EF6, bitte erlauben Sie mir, um meine Erfahrung mitteilen, im Fall jemand anderes auf der Suche ist die gleiche Sache.
Problem: Genau das gleiche: Passwort & ConfirmPassword 2 [NotMapped] Felder der User-Klasse. Beim speichern Neuer Rekord, ich war immer die Validierung Ausnahme, dass beide Felder benötigt wurden.
Untersuchung: ich habe bemerkt, dass wenn ich die Aktualisierung der Benutzer-Datensatz, hatte ich keine Probleme. Suche nach was ist der Unterschied, ich sah, ich hatte überschrieben die Validate-Methode
für die überprüfung der MVC-Modell, und die EF6 war die Anzeige meiner benutzerdefinierte Fehlermeldung!!!
Voila! EF6 verwendet, auch diese
Validate
Methode! (und durch einen Fehler in meinem code, es war die Auslösung der Fehler).Fazit: Beim speichern einer Entität, EF6 löst die
Validate
Methode und "ValidationResult" wird verhindern Datensatz speichern.