質問

VS2010年Beta2,.NET4.

私のASP.NET MVC2申請時に提出し下記のアクションメソッドを受け入れるオブジェクトが作成した企業の枠組みにとっては、以下のようなエラー:

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

本物件は、という"Text"での"テキストNULLでない場合には"MS SQL2008年.

自動チェックしている場合にはnulloremptyであれば、モデル誤差を追加するときは、私はエラーってすぐに提出します。

役に立ちましたか?

解決

いとの結合に直接entity?いように見えます。いかの選択

  1. 書カスタムモデルのバインダーもnullの場合->空の文字列が返されます。
  2. 結合した編集型でnullではなく、そこには空文字列コピーした場合の値は、企業の行動です。

い選択ポリシー-ブリーフ第2号ます。と思うのを使用表示/編集モデルは、ここにはあのはいかがでしょうか。

他のヒント

私は同じ問題を抱えていました。私は周りを見回したとここの周りに仕事を見つけました。これは、EFの検証が必要なフィールド検証の前に行わによって引き起こされているような問題を説明しています。それはまた、我々は[DisplayFormat]タグを使用してこの問題を回避する方法を示しています。これはあなたを助けることを願っています。

ここでの質問へのリンクや回避策があります:

サーバーMVC2 Entity Frameworkの4で必要な文字列プロパティの側の検証が動作しません

これはMVC2とEntity Frameworkの4の問題ですか、これは仕様でしょうか? EFのプロパティの検証が日時非NULL可能(必須)フィールドと文字列フィールド対数値のデータ型の検証のための罰金は、のviewmodelsを使用せずに取り組んでいる作品が表示されます。

Iは、単一の非NULL可能VARCHARを使用した単純なFOOBARテーブルで使用して、問題を再現(50)の列がSLQ 2008年barNameと呼ばれる私はそのデータベースからEFモデルを生成し、迅速コントローラとのCREATEビューを追加しますFOOBARエンティティ。私はPOSTへのプロパティbarNameの値で入力せずにアクションを作成しようとすると、VSは(ちょうど上記のような)モデルのdesigner.csファイル内の例外に繰り返します。私は例外過去のステップにしようとすると、フォーム上のアップ検証メッセージショーやフィールドがピンク色で強調表示されます。

それは何かが正しい順序で発射されていないように思えます。 VSはHTTPPOST CREATEメソッドに、手順の前に例外が発生しますので。

私は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を指定して、サーバー上で失敗することはありません。

私は同じ問題を抱えていたし、このようfalsetrueを行うことによって、それを固定します:

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

私はちょうど同じ問題を自分で持っていたし、解決策を見つけるためにここに来ました。しかし、その答えを向上させることができます。

SvavarのとHackITMngrは、しかし、両方を組み合わせること最良の結果を与え、正しい軌道に乗っていました。あなたはEFモデルに変更すると、カスタムの変更を失う危険のようにして、生成されたクラスを飾る行きたくない。

[たmetadataType(typeof演算(MyTableMetaData))]     公共部分クラスMyTableという     {         //アルバムクラスのバリデーションルール

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

2の間の任意の引数を解決するには。私はHackITMngrが充実した、Svavarのが直接の答えだったと思います。

私のために素晴らしい作品!

私は、フィールドごとに計算さStoreGeneratedPatternプロパティを設定し、それが私のために問題を解決します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top