Vra

VS 2010 Beta 2, .NET 4.

In my ASP.NET MVC 2-toepassing, wanneer ek 'n vorm indien by 'n aksiemetode wat 'n objek aanvaar wat deur die entiteitsraamwerk geskep is, kry ek die volgende fout:

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

Die eiendom word "Teks" genoem en is van die tipe "teks NIE NULL" in MS SQL 2008.

My aksie sal kyk of die waarde nullorempty is, indien wel, sal 'n modelfout bygevoeg word, maar ek kry die fout sodra ek die vorm indien.

Was dit nuttig?

Oplossing

Is jy direk binding aan die entiteit? Seker lyk dit. So het jy twee keuses:

  1. Skryf 'n persoonlike model band wat null vertaal -.> Leë string
  2. Bind 'n wysig model wat dit moontlik maak nulls plaas, en dan is dit verander na leë string wanneer jy die waardes van die entiteit kopieer in die aksie.

Ek sal kies # 2, persoonlik. Ek dink jy moet altyd gebruik view / edit modelle, en dit is 'n goeie voorbeeld van hoekom.

Ander wenke

Ek is met dieselfde probleem. Ek kyk rond en het 'n werk hier rond. Dit beskryf die probleem as wat veroorsaak word deur die EF validering plaasvind voordat die verlangde veld bekragtiging. Dit wys ook hoe ons kan werk om hierdie probleem deur die gebruik van 'n [DisplayFormat] Tag. Hoop dit sal jou help.

Hier is die skakel na die vraag en die tydelike oplossing:

Server -side bekragtiging van 'n vereiste String Property in MVC2 Entity Framework 4 nie werk

Is dit 'n probleem met die MVC2 en Entiteit Raamwerk 4 of is dit deur ontwerp? Dit wil voorkom asof bekragtiging van EF eienskappe werk goed vir DATETIME nie waarvoor geen nul mag (vereis) velde en tipe data validering van numeriese versus string velde werk sonder om ViewModels gebruik.

Ek die kwessie herskep met behulp van 'n eenvoudige Foobar tafel met behulp van 'n enkele, nie waarvoor geen nul mag varchar (50) kolom genoem barName in slq 2008. Ek gegenereer die EF model van daardie databasis en vinnig bygevoeg 'n kontroleerder en 'n CREATE oog vir die Foobar entiteit. As ek probeer om pos aan die SKEP aksie sonder om in 'n waarde vir die eiendom barName, VS stappe in 'n uitsondering in die designer.cs lêer van die model (net soos die een hierbo). Wanneer ek probeer om stap verby die uitsondering, is die bevestiging boodskap vertoon op die vorm en die veld uitgelig in pienk.

Dit lyk asof iets is nie 'n vuur in die korrekte volgorde. Omdat die uitsondering voorkom voor VS stappe in die HTTPPOST SKEP metode.

Ek het gevind dat die kode van die ASP.Net MvcMusicStore monster nuttig. http://mvcmusicstore.codeplex.com/releases/view/44445#DownloadId= 119336

Dit wil voorkom asof die binding aan die ViewModel vasgestel die probleem.

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 se antwoord het my gehelp. Ek het ook hierdie eienskap om die eiendom en nou dit werk.

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

Dit lyk soos volg:

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

Voer die naam ruimte:

using System.ComponentModel.DataAnnotations;

en voeg die kenmerk eiendom [Required]

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

So ModelState.IsValid gelyk vals, wat fout boodskap in die validering en sal nie dof brand op die bediener met null.

Ek het dieselfde probleem en vaste dit deur false om true soos volg:

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

Ek het net die dieselfde probleem myself, en het hierheen gekom om die oplossing te vind. Tog kan die antwoord verbeter.

Svavar en HackITMngr was op die regte pad, maar die kombinasie van beide gee die beste resultate. Jy wil nie om te gaan versier die gegenereerde klasse, as jy die risiko dat jy jou persoonlike veranderinge op veranderinge aan die EF model.

[MetadataType (typeof (MyTableMetaData))]     openbare gedeeltelike klas MyTable     {         // Validatie Reëls vir die Album klas

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

Om enige argumente tussen die twee te los. Ek sou sê Svavar was die direkte antwoord, HackITMngr was die verbetering.

Werke groot vir my!

Ek stel StoreGeneratedPattern eiendom soos bereken vir elke veld en dit het die probleem opgelos vir my.

Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top