سؤال

VS 2010 BETA 2 ، .NET 4.

في تطبيق ASP.NET MVC 2 الخاص بي ، عندما أقوم بإرسال نموذج إلى طريقة إجراء يقبل كائنًا تم إنشاؤه بواسطة إطار الكيان ، أحصل على الخطأ التالي:

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

يسمى الخاصية "النص" وهي من نوع "النص غير الفارغ" في MS SQL 2008.

سوف تحقق الإجراء الخاص بي ما إذا كانت القيمة NullorEmpty ، إذا كان الأمر كذلك ، فسيتم إضافة خطأ في النموذج ، لكنني أحصل على الخطأ بمجرد إرسال النموذج.

هل كانت مفيدة؟

المحلول

هل أنت ملزم مباشرة بالكيان؟ بالتأكيد يبدو ذلك. لذلك لديك خياران:

  1. اكتب موثق طراز مخصص يترجم null -> سلسلة فارغة.
  2. اربط بنموذج تحرير يسمح بالخلايا الخالية بدلاً من ذلك ، ثم قم بتغيير هذه السلسلة الفارغة عند نسخ القيم إلى الكيان في الإجراء.

سأختار #2 ، شخصيا. أعتقد أنه يجب عليك دائمًا استخدام النماذج العرض/التحرير ، وهذا مثال رائع على السبب.

نصائح أخرى

كانت لدي نفس المشكله. نظرت حولي ووجدت عملًا هنا. يصف المشكلة بأنها ناتجة عن التحقق من صحة EF قبل التحقق من صحة الحقل المطلوب. كما يوضح كيف يمكننا العمل حول هذه المشكلة باستخدام أ [DisplayFormat] بطاقة شعار. ارجوا ان يساعدك هذا.

إليك رابط السؤال والحل البديل:

لا يعمل التحقق من جانب الخادم لخاصية السلسلة المطلوبة في MVC2 Entity Framework 4

هل هذه مشكلة في MVC2 و Entity Framework 4 أم أن هذا حسب التصميم؟ يبدو أن التحقق من صحة خصائص EF يعمل بشكل جيد بالنسبة لحقول DateTime (المطلوبة) (المطلوبة) والتحقق من صحة نوع البيانات من حقول الرقم مقابل السلسلة دون الحاجة إلى استخدام ViewModels.

لقد قمت بإعادة إنشاء المشكلة باستخدام جدول Foobar بسيط باستخدام عمود Varchar (50) غير قابل للفرق يسمى Barname في SLQ 2008. قمت بإنشاء نموذج EF من قاعدة البيانات هذه وأضفت بسرعة وحدة تحكم وإنشاء طريقة إنشاء كيان Foobar. إذا حاولت نشر إجراء إنشاء دون الدخول في قيمة لسمام الخاصية ، فإن VS خطوات إلى استثناء داخل ملف Designer.cs للنموذج (تمامًا مثل هذا المذكور أعلاه). عندما أحاول تجاوز الاستثناء ، تظهر رسالة التحقق من الصحة في النموذج ويتم تمييز الحقل باللون الوردي.

يبدو أن شيئًا ما لا يطلق النار في التسلسل الصحيح. لأن الاستثناء يحدث قبل VS خطوات في طريقة إنشاء HTTPPOST.

لقد وجدت الرمز من عينة ASP.NET MVCMUSICSTORE مفيدة. http://mvcmusicstore.codeplex.com/releases/view/44445#downloadid=119336

يبدو أن الارتباط بـ ViewModel يحدد المشكلة.

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; }
        }
    }
}

ساعدني إجابة آشيش شاكيا. أضفت هذه السمة إلى العقار والآن تعمل.

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

لذلك يبدو هكذا:

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

استيراد مساحة الاسم:

using System.ComponentModel.DataAnnotations;

وأضف خاصية السمة [Required]

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

وبالتالي ، فإن modelState.IsvalId يساوي خطأ ، مما يوضح رسالة الخطأ في التحقق من الصحة ولن تفشل على الخادم مع NULL.

واجهت نفس المشكلة وأصلحها عن طريق صنعها false ل true مثله:

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

لقد واجهت نفس المشكلة بنفسي ، وجئت إلى هنا للعثور على الحل. ومع ذلك ، يمكن تعزيز الإجابة.

كان Svavar's و Hackitmngr على المسار الصحيح ، ولكن الجمع بين كلاهما يعطي أفضل نتيجة. لا تريد الذهاب لتزيين الفصول التي تم إنشاؤها ، حيث تخاطر بفقدان التغييرات المخصصة عند التعديلات على نموذج EF.

metadatatype (typeof (mytablemetadata))] فئة جزئية عامة mytable {// قواعد التحقق من صحة لفئة الألبوم

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

لتسوية أي حجج بين الاثنين. أود أن أقول أن Svavar كان الجواب المباشر ، كان Hackitmngr هو التعزيز.

يعمل بشكل رائع بالنسبة لي!

قمت بتعيين خاصية storegenatedpattern كمحسوبة لكل حقل وحل المشكلة بالنسبة لي.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top