6

VS 2010 Beta 2、.NET4。

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

このプロパティは「テキスト」と呼ばれ、MSSQL2008では「テキストNOTNULL」タイプです。

私のアクションは、値がnullまたは空かどうかをチェックします。nullまたは空の場合、モデルエラーが追加されますが、フォームを送信するとすぐにエラーが発生します。

4

8 に答える 8

9

エンティティに直接バインドしていますか?確かにそれのように見えます。したがって、2つの選択肢があります。

  1. null->空の文字列を変換するカスタムモデルバインダーを記述します。
  2. 代わりにnullを許可する編集モデルにバインドし、アクションのエンティティに値をコピーするときにこれを空の文字列に変更します。

個人的には#2を選びます。常に表示/編集モデルを使用する必要があると思います。これはその理由の良い例です。

于 2009-11-23T13:58:08.903 に答える
4

私も同じ問題を抱えていました。私は周りを見回して、このあたりの作品を見つけました。これは、必須フィールドの検証の前に行われるEF検証によって引き起こされる問題として説明しています。[DisplayFormat]また、タグを使用してこの問題を回避する方法も示しています。これがお役に立てば幸いです。

質問へのリンクと回避策は次のとおりです。

MVC2 EntityFramework4のREQUIREDStringプロパティのサーバー側検証が機能しない

于 2010-10-03T15:37:43.643 に答える
3

false私は同じ問題を抱えていて、これを好きにすることでそれを修正しましたtrue

Line 4502:
_Text = StructuralObject.SetValidValue(value, false);
于 2012-04-24T19:35:47.337 に答える
2

これはMVC2とEntityFramework4の問題ですか、それとも仕様によるものですか?EFプロパティの検証は、日時のnull許容でない(必須の)フィールドで正常に機能し、数値フィールドと文字列フィールドのデータ型の検証は、ViewModelsを使用せずに機能しているようです。

slq 2008でbarNameと呼ばれる単一のnull許容でないvarchar(50)列を使用して、単純なFOOBARテーブルを使用して問題を再現しました。そのデータベースからEFモデルを生成し、FOOBARエンティティのコントローラーとCREATEビューをすばやく追加しました。プロパティbarNameの値を入力せずにCREATEアクションにPOSTしようとすると、VSはモデルのdesigner.csファイル内の例外にステップインします(上記のように)。例外を超えようとすると、検証メッセージがフォームに表示され、フィールドがピンク色で強調表示されます。

何かが正しい順序で発火していないようです。VSがHTTPPOSTCREATEメソッドにステップインする前に例外が発生するためです。

ASP.NetMvcMusicStoreサンプルのコードが役に立ちました。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; }
        }
    }
}
于 2010-06-26T01:39:23.313 に答える
1

名前空間をインポートします。

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はfalseに等しく、検証でエラーメッセージを表示し、Nullでサーバーで失敗することはありません。

于 2012-07-19T23:23:59.127 に答える
1

AshishShakyaの答えは私を助けてくれました。この属性をプロパティに追加したところ、機能するようになりました。

[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();
        }
    }
于 2012-05-24T09:24:22.873 に答える
0

私も同じ問題を抱えていたので、解決策を見つけるためにここに来ました。ただし、答えは強化できます。

SvavarとHackITMngrは正しい方向に進んでいましたが、両方を組み合わせると最良の結果が得られます。EFモデルを変更するとカスタム変更が失われるリスクがあるため、生成されたクラスを装飾することは避けてください。

[MetadataType(typeof(MyTableMetaData))]public部分クラスMyTable{//Albumクラスの検証ルール

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

2つの間の議論を解決するため。Svavarが直接の答えであり、HackITMngrが拡張機能だったと思います。

私にとっては素晴らしい作品です!

于 2013-01-15T03:08:03.850 に答える
0

StoreGeneratedPatternプロパティをフィールドごとにComputedとして設定すると、問題が解決しました。

于 2015-03-02T14:46:55.097 に答える