Pregunta

VS 2010 Beta 2, 4 .NET.

En mi aplicación ASP.NET MVC 2, 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 lo es, se añadirá un error del modelo, pero me sale el error tan pronto como enviar el formulario.

¿Fue útil?

Solución

¿Está uniéndose directamente a la entidad? Seguro que parece ser la misma. Así que hay dos opciones:

  1. Escribir un ligante modelo personalizado que se traduce nula -.> Cadena vacía
  2. Enlazar a un modelo de edición que permite valores nulos en su lugar, y luego cambiar a esta cadena vacía al copiar los valores de la entidad en la acción.

elegiría # 2, personalmente. Creo que siempre se debe utilizar ver / editar modelos, y esto es un gran ejemplo de por qué.

Otros consejos

Yo estaba teniendo el mismo problema. Miré alrededor y encontré un trabajo por aquí. En él se describe el problema como causado por la validación de EF que tiene lugar antes de la validación de campos obligatorios. También muestra cómo podemos solucionar este problema mediante el uso de una etiqueta [DisplayFormat]. Espero que esto le ayudará.

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

Servidor

validación -side de una propiedad de cadena requerida en MVC2 Entity Framework 4 no funciona

Es esto un problema con el MVC2 y Entity Framework 4 o esto es por diseño? Parece que la validación de las propiedades EF funciona bien para los campos de fecha y hora no anulable (obligatorio) y la validación de tipo de datos numérico frente a los campos de cadena está trabajando sin tener que utilizar ViewModels.

I recreado el problema utilizando con una simple tabla FOOBAR utilizando un único varchar, no anulable (50) columna llamada barName en SLQ 2008. me genera el modelo de EF desde esa base de datos y rápidamente añadido un controlador y una vista CREATE para la FOOBAR entidad. Si trato de correo a la acción create sin entrar en un valor para la propiedad barName, VS pasos en una excepción dentro del archivo designer.cs del modelo (al igual que la anterior). Cuando, trato de dar un paso más allá de la excepción, el mensaje de validación aparece en el formulario y el campo está resaltado en color rosa.

Parece que hay algo que no está disparando en la secuencia correcta. Debido a que la excepción se produce antes de los pasos VS en el HttpPost método CREATE.

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

Parece que la unión al modelo de vista corrige 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; }
        }
    }
}
respuesta

de Ashish Shakya me ayudó. He añadido este atributo a la propiedad y ahora funciona.

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

Por lo que se ve 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();
        }
    }

Importar el espacio de nombres:

using System.ComponentModel.DataAnnotations;

Y añadir el [Required] propiedad de atributo

[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 falso, que muestra el mensaje de error en la validación y no dejarán en el servidor con Null.

Yo tenía el mismo problema y lo arreglaron al hacer false a true como esto:

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

Sólo tenía el mismo problema por mí mismo, y vine aquí para encontrar la solución. Sin embargo, la respuesta puede ser mejorada.

Svavar de HackITMngr y estaban en el camino correcto, sin embargo, la combinación de ambos da el mejor resultado. Usted no quiere ir a la decoración de las clases generadas, ya que corre el riesgo de perder los cambios personalizados sobre modificaciones al modelo de EF.

[MetadataType (typeof (MyTableMetaData))]     MiTabla clase parcial pública     {         // Las reglas de validación para la clase del álbum

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

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

funciona muy bien para mí!

conjunto de propiedades StoreGeneratedPattern calculado para cada campo y se solucionó el problema para mí.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top