2014-10-10 12 views
5

Hallo, ich bin mit Entity Framework 6.1.1, die die Indexdaten Annotation-Feature in die es unterstützt. Ich habe ein Feld in meiner Entity-Klasse wie folgt definiert:Fehlermeldung für Indexdaten Anmerkung in EF

[Index("scoreIndex", IsUnique=true)] 
    public int score{ get; set; } 

Dies funktioniert gut. Ich versuche jedoch herauszufinden, wie eine Nachricht angezeigt wird, wenn die Bewertung nicht eindeutig ist. Im Moment gibt es nur eine Ausnahme. Ich habe versucht, die folgenden

[Index("scoreIndex", IsUnique=true, ErrorMessage="Score must be unique")] 

Aber es ist nicht die Definition für Errormessage für diesen Index Annotation-Klasse enthält. Können Sie mir bitte sagen, wie die Ausnahmemeldung zu handhaben, so dass sie es anmutig Griffe?

+0

Das Index-Attribut weist EF an, einen Index zu erstellen, wenn die Migration ausgeführt wird. EF führt den Index nicht durch. Sie müssen die Ausnahme in Ihrem Code behandeln. Alternativ könnten Sie eine benutzerdefinierte Datenannotation schreiben, die die Eigenschaft tatsächlich auf Eindeutigkeit überprüft. –

Antwort

2

Das IndexAttribute ist kein Validierungsattribut, und deshalb verfügt es nicht über die ErrorMessage-Eigenschaft und es verfügt auch nicht über die IsValid() - Methode, mit der es gegen einen Bereich gültiger Werte überprüft wird.

Das bedeutet, dass es nicht wie die typischen Validation Attribute validiert werden soll (Required, MaxLength etc.). Das IsUnique Attribut wird nur während der Tabellenerstellung verwendet, um einen eindeutigen Index zu erstellen.

Wenn Sie Attribute verwenden möchten, sollten Sie ein benutzerdefiniertes Attribut erstellen, um die Eindeutigkeit des Index zu überprüfen. Dieser Index erben würde natürlich die ValidationAttribute Klasse und würde die EF DbContext intern zugreifen muß, um die Einzigartigkeit in dem Attributvalidierungscode zu überprüfen.

Wenn Sie diese Daten-Annotation Ansatz gefällt, und es ist zu komplex, dann können Sie die DbUpdateException durch die Savechanges() -Methode in einem Try-Catch-Block geworfen Griff, dekodieren die Fehlermeldung und das Rück etwas freundlich in Dein Ansichtsmodell.