2009-11-22 17 views
5

VS 2010 Beta 2, .NET 4.error Marco de la entidad al presentar los campos vacíos

2 En mi aplicación ASP.NET MVC, cuando presente un formulario a un método de acción que acepta un objeto creado por el marco de la entidad , me sale el siguiente error:

Exception Details: System.Data.ConstraintException: This property cannot be set to a 
null value. 

Source Error: 


Line 4500:    OnTextChanging(value); 
Line 4501:    ReportPropertyChanging("Text"); 
Line 4502:    _Text = StructuralObject.SetValidValue(value, false); 
Line 4503:    ReportPropertyChanged("Text"); 
Line 4504:    OnTextChanged(); 

la propiedad se denomina "texto" y es de tipo "texto NO NULO" en MS SQL 2008.

Mi acción comprobará si el valor es nullorempty, si es decir, se agregará un error de modelo, pero recibo el error tan pronto como envíe el formulario.

+0

Quizás esto no esté directamente relacionado con su pregunta, pero el tipo de datos TEXT está en desuso. Tiene NVARCHAR (MAX) desde SQL Server 2005. Es mucho más fácil de usar en muchas situaciones. – LukLed

+0

Gracias, cambié mis campos a nvarchar (y actualicé el modelo de base de datos usando el asistente de actualización de la entidad marco), pero el problema todavía existe. – Omar

Respuesta

8

¿Está vinculando directamente a la entidad? Claro que se parece. Entonces usted tiene dos opciones:

  1. Escriba un encuadernador de modelo personalizado que traduzca null -> cadena vacía.
  2. Enlace a un modelo de edición que permite nulos en su lugar, y luego cámbielo a cadena vacía cuando copie los valores a la entidad en la acción.

Elegiría el número 2, personalmente. Creo que siempre debes usar ver/editar modelos, y este es un gran ejemplo de por qué.

2

¿Es esto un problema con MVC2 y Entity Framework 4 o es esto por diseño? Parece que la validación de las propiedades de EF funciona bien para los campos de fecha y hora no obligatorios (obligatorios) y la validación del tipo de datos de los campos numéricos y de cadena funciona sin tener que usar ViewModels.

Recreé el problema usando una tabla simple de FOOBAR utilizando una única columna varchar (50) no nulable llamada barName en slq 2008. Genere el modelo EF de esa base de datos y agregué rápidamente un controlador y una vista CREATE para la entidad FOOBAR. Si intento enviar a la acción CREAR sin ingresar un valor para la propiedad barName, VS entra en una excepción dentro del archivo designer.cs del modelo (como el anterior). Cuando, intento pasar la excepción, aparece el mensaje de validación en el formulario y el campo se resalta en rosa.

Parece que algo no está disparando en la secuencia correcta. Porque la excepción ocurre antes de que VS ingrese al método HTTPPOST CREATE.

Encontré el código de la muestra ASP.Net MvcMusicStore útil. http://mvcmusicstore.codeplex.com/releases/view/44445#DownloadId=119336

Parece que el enlace al ViewModel soluciona el problema.

namespace MvcMusicStore.ViewModels 
{ 
    public class StoreManagerViewModel 
    { 
     public Album Album { get; set; } 
     public List<Artist> Artists { get; set; } 
     public List<Genre> Genres { get; set; } 
    } 
} 
........ 

namespace MvcMusicStore.Models 
{ 
    [MetadataType(typeof(AlbumMetaData))] 
    public partial class Album 
    { 
     // Validation rules for the Album class 

     [Bind(Exclude = "AlbumId")] 
     public class AlbumMetaData 
     { 
      [ScaffoldColumn(false)] 
      public object AlbumId { get; set; } 

      [DisplayName("Genre")] 
      public object GenreId { get; set; } 

      [DisplayName("Artist")] 
      public object ArtistId { get; set; } 

      [Required(ErrorMessage = "An Album Title is required")] 
      [StringLength(160)] 
      public object Title { get; set; } 

      [DisplayName("Album Art URL")] 
      [StringLength(1024)] 
      public object AlbumArtUrl { get; set; } 

      [Required(ErrorMessage = "Price is required")] 
      [Range(0.01, 100.00, ErrorMessage="Price must be between 0.01 and 100.00")] 
      public object Price { get; set; } 
     } 
    } 
} 
4

Estaba teniendo el mismo problema. Miré a mi alrededor y encontré un trabajo por aquí. Describe el problema como causado por la validación de EF que tiene lugar antes de la validación del campo Requerido. También muestra cómo podemos evitar este problema utilizando una etiqueta [DisplayFormat]. Espero que esto te ayudará.

Aquí está el enlace a la pregunta y la solución:

Server-side validation of a REQUIRED String Property in MVC2 Entity Framework 4 does not work

1

que tenían el mismo problema y lo arreglaron al hacer false a true así: respuesta

Line 4502: 
_Text = StructuralObject.SetValidValue(value, false); 
1

Ashish de Shakya ayudó yo. Agregué este atributo a la propiedad y ahora funciona.

[DisplayFormat(ConvertEmptyStringToNull = false, NullDisplayText="")] 

para que se vea así:

[EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=false)] 
    [DataMemberAttribute()] 
    [DisplayFormat(ConvertEmptyStringToNull = false, NullDisplayText="")] 
    public global::System.String MyProperty 
    { 
     get 
     { 
      return _MyProperty; 
     } 
     set 
     { 
      OnMyPropertyChanging(value); 
      ReportPropertyChanging("MyProperty"); 
      _MyProperty = StructuralObject.SetValidValue(value, false); 
      ReportPropertyChanged("MyProperty"); 
      OnMyPropertyChanged(); 
     } 
    } 
1

Importe el espacio de nombres:

using System.ComponentModel.DataAnnotations; 

y añadir la propiedad de atributo [Required]

[Required] 
public global::System.String MyProperty 
    { 
     get 
     { 
      return _MyProperty; 
     } 
     set 
     { 
      OnMyPropertyChanging(value); 
      ReportPropertyChanging("MyProperty"); 
      _MyProperty = StructuralObject.SetValidValue(value, false); 
      ReportPropertyChanged("MyProperty"); 
      OnMyPropertyChanged(); 
     } 
    } 

Así ModelState.IsValid es igual a falsa , mostrando mensaje de error en la validación y no fallará en el servidor con nulo.

0

Acabo de tener el mismo problema y vine a buscar la solución. Sin embargo, la respuesta puede ser mejorada.

Svavar y HackITMngr iban por el buen camino, sin embargo, la combinación de ambos da el mejor resultado. No desea ir decorando las clases generadas, ya que corre el riesgo de perder sus cambios personalizados al modificar el modelo EF.

[MetadataType (typeof (MyTableMetaData))] clase parcial público MyTable { reglas // validación para la clase Album

public class MyTableMetaData 
    { 
     [DisplayFormat(ConvertEmptyStringToNull = false, NullDisplayText="")] 
     public string MyTextProperty { get; set; } 
    } 
} 

para resolver cualquier argumentos entre los dos. Yo diría que la respuesta directa fue Svavar, HackITMngr fue la mejora.

¡Funciona muy bien para mí!

0

Establecí la propiedad StoreGeneratedPattern como calculada para cada campo y me solucionó el problema.

Cuestiones relacionadas