2010-06-27 7 views
14

Sto tentando di ottenere la convalida lato server di una proprietà String di Entity Framework da utilizzare. Altre convalide sul lato server come la convalida del tipo di dati e la data richiesta. Le proprietà EF numeriche e temporali funzionano.La convalida lato server di una proprietà stringa RICHIESTA in MVC2 Entity Framework 4 non funziona

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

La proprietà String con cui si verificano problemi è associata a una colonna non nullable SQL 2008, Varchar (50).

Quando provo a pubblicare sulla mia azione Create con una stringa vuota per questa proprietà, viene visualizzato l'errore follwing.

Dettagli eccezione: System.Data.ConstraintException: questa proprietà non può essere impostata su un valore nullo.

Quando annuncio sull'azione con uno spazio vuoto, ottengo correttamente un messaggio di convalida del campo richiesto.

Ho provato a utilizzare Annotazioni dati e ClientSideValidation ma sembra che ci siano problemi con ClientSideValidation che funziona su viste parziali e finestre di dialogo jQuery.

Ecco il codice originale generato automaticamente dal framework entità.

[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(); 
    } 
} 

seconda della firma del metodo azione (creare o modificare), l'eccezione può verificarsi prima di entrare nel metodo o nel metodo quando UpdateModel() viene chiamato. L'eccezione interna si trova nella riga sottostante dal file model.designer.cs.

_GradeTypeName = StructuralObject.SetValidValue(value, false); 

Sono stato in grado di riprodurlo su una semplice applicazione Web mvc2.

risposta

28

stavo avendo lo stesso problema per un po '. Ho trovato una spiegazione qui: http://mvcmusicstore.codeplex.com/workitem/6604. Per dirla in poche parole, l'eccezione "System.Data.ConstraintException: questa proprietà non può essere impostata su un valore nullo" viene generata dalla proprietà Validation di entità. Questa convalida viene eseguita quando l'applicazione mvc tenta di associare il campo modulo alla corrispondente proprietà dell'entità (si chiama PreBinding Validation e si verifica quando si invia il modulo). Poiché il campo è vuoto (quindi convertito in null), il raccoglitore tenta di associare un valore nullo alla proprietà, che viola il vincolo Non Null sulla proprietà dell'entità.

Ma se si registra con un campo vuoto (che è diverso da vuoto, quindi null) la convalida di entità passa (poiché la proprietà non è più impostata su un valore nullo) e quindi viene visualizzato il messaggio "Richiesto" convalida dell'annotazione, che viene eseguita dopo la prebinding (è Convalida PostBinding).

Una soluzione consiste nell'utilizzare l'annotazione [DisplayFormat (ConvertEmptyStringToNull = false)] che indica al raccoglitore di non convertire una stringa vuota in null.

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

Spero che questo aiuti!

+0

Grazie! Questo è stato un problema per me fino a quando ho trovato il tuo post. – jrob

+0

No, problemo! Sono contento che questo abbia aiutato! – tinesoft

+0

+1 per un'ottima risposta (collegamento, avviso distillato) –

4

Questo è stato molto utile. Sto usando MVC3 e framework di entità.Stavo passando le mie entità direttamente nel controller, ma ho ottenuto lo stesso errore quando il modulo era vuoto. Con il framework di entità è possibile eseguire la convalida dei dati modificando il codice generato automaticamente, ma la creazione di una classe parziale separata dell'entità ha funzionato meglio per me.

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

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

volte nel database primo approccio in EF, può aggiornare la vostra colonna da not null a può essere null utilizzando query SQL e utilizzare 'aggiornamento del modello da Database ...' (in EDMX tasto destro del mouse), allora forse di proprietà di quell'entità non è stata aggiornata correttamente e quindi se hai alcuni dati null in quella colonna, nella mappatura, si verifica una violazione e questo errore viene mostrato.

Per risolvere questo; È possibile controllare lo Nullable in Proprietà di quella proprietà di entità che lo si è aggiornato.

Problemi correlati