2010-06-27 1 views
14

Ich versuche serverseitige Validierung einer Entity Framework String-Eigenschaft zu arbeiten. Andere serverseitige Validierungen wie Datentypvalidierung und erforderliche dateTime- und numerische EF-Eigenschaften funktionieren.Server-seitige Validierung einer Required String-Eigenschaft in MVC2 Entity Framework 4 funktioniert nicht

Dies in VS 2010, .NET 4.0, MVC2 + Cloud, ADO.Net Entity Framework.

Die String-Eigenschaft, mit der ich Probleme habe, ist einer SQL 2008, Varchar (50) nicht Nullable-Spalte zugeordnet.

Wenn ich versuche, meine Create-Aktion mit einer leeren Zeichenfolge für diese Eigenschaft zu veröffentlichen, erhalte ich den folgenden Fehler.

Ausnahmedetails: System.Data.ConstraintException: Diese Eigenschaft kann nicht auf einen Nullwert festgelegt werden.

Wenn ich die Aktion mit einem Leerzeichen posten, erhalte ich erfolgreich eine erforderliche Feldüberprüfungsmeldung.

Ich habe versucht, Datenanmerkungen und ClientSideValidation zu verwenden, aber es scheint Probleme mit ClientSideValidation zu geben, die an Teilansichten und jquery Dialogen arbeiten.

Hier ist der ursprüngliche automatisch generierte Code aus dem Entity-Framework.

[EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=false)] 
[DataMemberAttribute()] 
public global::System.String GradeTypeName 
{ 
    get 
    { 
     return GradeTypeName; 
    } 
    set 
    { 
     OnGradeTypeNameChanging(value); 
     ReportPropertyChanging("GradeTypeName"); 
     _GradeTypeName = StructuralObject.SetValidValue(value, false); 
     ReportPropertyChanged("GradeTypeName"); 
     OnGradeTypeNameChanged(); 
    } 
} 

Je nach Unterzeichnung des Aktionsmethode (CREATE oder EDIT), kann die Ausnahme auftreten, bevor sie in dem Verfahren treten oder innerhalb des Verfahrens, wenn Update() aufgerufen wird. Die innere Ausnahme befindet sich in der Zeile unterhalb der Datei model.designer.cs.

_GradeTypeName = StructuralObject.SetValidValue(value, false); 

Ich konnte dies auf einer einfachen MVC2-Webanwendung reproduzieren.

Antwort

28

Ich hatte das gleiche Problem für eine Weile. Ich habe hier eine Erklärung gefunden: http://mvcmusicstore.codeplex.com/workitem/6604. Um es auf den Punkt zu bringen, die Ausnahme "System.Data.ConstraintException: Diese Eigenschaft kann nicht auf einen Nullwert festgelegt werden" wird von Entity Validation geworfen. Diese Validierung wird ausgeführt, wenn Ihre mvc-Anwendung versucht, das Formularfeld an die entsprechende Entitätseigenschaft zu binden (sie heißt PreBinding Validation und tritt beim Absenden des Formulars auf). Da das Feld leer ist (also in null konvertiert wird), versucht der Binder, einen NULL-Wert an die Eigenschaft zu binden, wodurch die Nicht-Null-Einschränkung für die Eigenschaft Ihrer Entität verletzt wird.

Wenn Sie jedoch mit einem leeren Feld schreiben (das sich von leer unterscheidet, also null), wird die Entitätsprüfung bestanden (da die Eigenschaft nicht mehr auf einen Nullwert gesetzt ist), und Sie sehen dann die Nachricht von "Erforderlich" Annotation Validierung, die nach dem Prebinding durchgeführt wird (es ist PostBinding Validation).

Eine Abhilfe ist die Anmerkung [Displayformat (ConvertEmptyStringToNull = false)], die mit dem Bindemittel zu verwenden, sagt keine leere Zeichenfolge auf null zu konvertieren.

[Required] 
    [DisplayFormat(ConvertEmptyStringToNull = false)] 
    public string YourStringProperty { get; set;} 

Hoffe, das hilft!

+0

Danke! Das war ein Problem für mich, bis ich deinen Beitrag gefunden habe. – jrob

+0

Nein, problemo! Ich bin froh das hat geholfen! – tinesoft

+0

+1 für eine sehr gute Antwort (Link, destillierter Rat) –

4

Das war sehr hilfreich. Ich benutze MVC3 und Entity Framework.Ich übertrug meine Entitäten direkt in den Controller, bekam aber den gleichen Fehler, wenn das Formular leer war. Mit dem Entity-Framework können Sie Daten validieren, indem Sie den automatisch generierten Code bearbeiten, aber das Erstellen einer separaten Teilklasse der Entity funktionierte für mich besser.

[MetadataType(typeof(TestEntityValidation))] 
public partial class TestEntity{ 
} 

public class TestEntityValidation{ 
    [Required] 
    [DisplayFormat(ConvertEmptyStringToNull = false)] 
    public String name { get;set} 
} 
2

Manchmal in der Datenbank ersten Ansatz in EF, können Sie Ihre Spalte von not null aktualisieren können null mit SQL-Abfrage sein und verwenden ‚Update Modell aus Datenbank ...‘ (in EDMX der rechten Maustaste), dann vielleicht Eigentum Diese Entität wurde nicht ordnungsgemäß aktualisiert, und wenn Sie in dieser Spalte null Daten haben, tritt bei der Zuordnung ein Verstoß auf und dieser Fehler wird angezeigt.

Um dies zu beheben; Sie können die Nullable in Eigenschaften dieser Eigenschaft der Entität überprüfen, die Sie aktualisiert haben.