Domanda

VS 2010 Beta 2 .Rete 4.

Nel mio ASP.NET MVC 2 applicazione, quando mi invia un modulo a un metodo di azione che accetta un oggetto creato da entity framework, ottengo il seguente errore:

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 proprietà è chiamato "Testo" e di tipo "text NOT NULL" in MS SQL 2008.

La mia azione si verifica se il valore è nullorempty, se è un errore di modello sarà aggiunto, ma mi da errore appena mi invia il modulo.

È stato utile?

Soluzione

Sono direttamente vincolanti per l'ente?Di sicuro sembra che si.Così si hanno due scelte:

  1. Scrivi un raccoglitore di modello personalizzato che si traduce null -> stringa vuota.
  2. Associare a una modifica del modello che consente valori null invece, e modifica questa stringa vuota quando si copia i valori per l'entità in azione.

Io sceglierei #2, personalmente.Penso che si dovrebbe sempre usare visualizzare/modificare i modelli, e questo è un ottimo esempio del perché.

Altri suggerimenti

ho avuto lo stesso problema. Mi sono guardato intorno e ho trovato un lavoro qui intorno. Esso descrive il problema come causati dalla convalida EF che ha luogo prima della convalida del campo richiesto. Viene inoltre illustrato come possiamo risolvere questo problema utilizzando un tag [DisplayFormat]. Spero che questo vi aiuterà.

Ecco il link alla domanda e la soluzione:

Server convalida -Side di un RICHIESTO stringa di proprietà in MVC2 Entity Framework 4 non funziona

Si tratta di un problema con il MVC2 e Entity Framework 4 o è questo progetto? Sembra che la convalida di immobili EF funziona bene per non annullabili campi datetime (necessario) e il tipo di dati di convalida numerici contro campi stringa lavora senza dover utilizzare ViewModel.

ho ricreato il problema utilizzando con una semplice tabella FOOBAR utilizzando un unico, varchar non annullabile (50) colonna chiamata barName in SLQ 2008. ho generato il modello EF da quel database e rapidamente aggiunto un controller e una vista CREATE per la FOOBAR entità. Se provo a POST all'azione CREATE senza entrare in un valore per la barName proprietà, VS passi in un'eccezione all'interno del file designer.cs del modello (proprio come quella qui sopra). Quando provo a fare un passo oltre l'eccezione, il messaggio di convalida si presenta sulla forma e il campo è evidenziato in rosa.

Sembra che qualcosa non sta sparando nella sequenza corretta. Perché l'eccezione si verifica prima VS passi nel HttpPost metodo create.

Ho trovato il codice dal campione ASP.Net MvcMusicStore utile. http://mvcmusicstore.codeplex.com/releases/view/44445#DownloadId= 119336

Sembra che il legame al ViewModel risolve il 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; }
        }
    }
}

Ashish Shakya risposta mi ha aiutato.Ho aggiunto questo attributo per la proprietà e ora funziona.

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

Così assomiglia a questo:

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

Importa lo spazio dei nomi:

using System.ComponentModel.DataAnnotations;

E aggiungere la proprietà [Required] attributo

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

Così ModelState.IsValid uguale falso, mostrando messaggio di errore nella validazione e non mancherà sul server con Null.

Ho avuto lo stesso problema e riparato facendo false a true in questo modo:

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

Ho appena avuto lo stesso problema me stesso, e sono venuto qui per trovare la soluzione. Tuttavia, la risposta può essere migliorata.

Svavar e di HackITMngr erano sulla strada giusta, ma che combina dà il miglior risultato. Tu non vuoi andare decorare le classi generate, come si rischia di perdere le modifiche personalizzate su modifiche al modello EF.

[MetadataType (typeof (MyTableMetaData))]     pubblico MyTable classe parziale     {         // regole di convalida per la classe Album

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

Per risolvere qualsiasi argomento tra i due. Direi Svavar è stata la risposta diretta, HackITMngr era la valorizzazione.

funziona grande per me!

Ho impostato proprietà StoreGeneratedPattern calcolata per ogni campo ed è risolto il problema per me.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top