4

クラスがあります-それは特別なことではない一般的なクラスです:

public class Trader{

public Guid UserId {get;set;}
public int TraderId { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public string PhoneNumber { get; set; }
public string Skype { get; set; }
public string Photo { get; set; }
public string Email { get; set; }

public virtual User User { get; set; }
}

マッピング:

 public TraderMap()
        {
            this.ToTable("Trader", "General");
            this.HasKey(a => a.TraderId);
            this.HasRequired(a => a.User).WithMany().HasForeignKey(a => a.UserId);
            Property(a => a.UserId).HasColumnName("UserID").IsRequired();
            Property(a => a.TraderId).HasColumnName("TraderID").IsRequired();

            Property(a => a.FirstName).HasMaxLength(50).IsRequired();
            Property(a => a.LastName).HasMaxLength(50).IsRequired();
            Property(a => a.PhoneNumber).HasMaxLength(25).IsRequired();
            Property(a => a.Skype).HasMaxLength(50).IsOptional();
            Property(a => a.Photo).HasMaxLength(100).IsOptional();
            Property(a => a.Email).HasMaxLength(100).IsRequired();
        }

フォーム(ビュー)でIsRequired()が空のFirstNameまたはその他のフィールドをそのままにしておくと、検証が開始されません。エラーが発生するだけです。

1つ以上のエンティティの検証に失敗しました。詳細については、「EntityValidationErrors」プロパティを参照してください。

残念ながら、このエラーはあまり意味がありません。もう少し掘り下げていたのですが、手に入れたのは

列名識別子が無効です。

どこかで(Userクラスの)継承を忘れてしまうのではないかと思いましたが、疑わしいものは何も見つかりませんでした。

問題は、Traderクラスで属性を使用すると、すべてが想定どおりに機能することです。

   public class Trader{

    public Guid UserId {get;set;}
    public int TraderId { get; set; }
    [Required]
    public string FirstName { get; set; }
    [Required]
    public string LastName { get; set; }
    [Required]
    public string PhoneNumber { get; set; }
    public string Skype { get; set; }
    public string Photo { get; set; }
    [Required]
    public string Email { get; set; }

    public virtual User User { get; set; }
    }

属性を使用すると、検証は正常に機能し、@ Html.ValidationMessageForはエラーメッセージの表示を開始し、NULL値の送信を許可しません。

私のマッピングで何が問題になるのか、何か提案はありますか?

UPDATE 1 実際、上記の属性はこの問題の可能な解決策です。

4

3 に答える 3

4

「データ注釈」を使用する場合にのみ検証が開始されます - HasRequired はマッピングを行いますが、データ注釈属性はマッピングと検証部分の両方を行います。
つまり、ビューを検証するには、プロパティに注釈/属性を配置する必要があると思います。

これは、「マッピング」だけと、マッピングと検証の両方を「区別」するためによく使用されます。つまり、両方が属性を使用する場合は、マッピングのみが必要な場合は流暢な構成を使用します。

ここでの関連する回答もhttps://stackoverflow.com/a/9310435/417747またはhttps://stackoverflow.com/a/9789984/417747

編集: Justin How to make Fluent API configuration work with MVC client side validation?のおかげで、これは必要なものにさらに近づいています。

于 2012-04-06T18:38:25.373 に答える
4

EF モデルの検証と MVC の検証を混同していると思います。MVC は EF について何も知らないか、またはその逆です。これらは、連携してうまく機能する個別のテクノロジーです。

流れるようなデータ モデルで検証を定義すると、Entity Framework の検証のみが定義されます。変更を保存しようとすると、EF が失敗し、検証に失敗したと不平を言うので、これは明らかに機能します。

繰り返しますが、これは MVC の検証とは関係がなく、2 つがほとんど一緒に機能しません (1 つの例外として、POCO クラスを使用していてデータ注釈を使用している場合、一部の注釈は MVC と EF の両方で機能します。ビューでデータ モデルを直接使用するのは良い方法ではないため、これは主に議論の余地があります。)

于 2012-04-06T18:59:09.760 に答える
1

あなたは両方とも正しかった、私は誤った仮定の下にあった.

[必須] は .IsRequired() と同等ではありません

考えられる解決策はいくつかあります。

1)すばやく簡単に:属性

モデル構成のオーバーライドと検証

CodeFirst を使用すると、OnModelCreating メソッドなどで、検証属性で定義されたモデルの構成をオーバーライドできます。検証では実際のモデル構成を使用する必要があるため、モデルの再構成は検証に影響します。属性をやみくもに使用すると、OnModelCreating() で行われたオーバーライドに従って有効な値に対して検証エラーが発生します。OnModelCreating で行われるオーバーライドの 3 つの特殊なケースを次に示します。

  • プロパティが [Required] 属性で装飾され、オプション (.IsOptional() メソッド) として再構成された場合、[Required] 属性は削除され、結果として検証時に無視されます。

  • プロパティが [StringLength] または [MaxLength] 属性で装飾され、新しい長さ (.HasMaxLength() メソッド) で構成された場合、可能であれば新しい最大長が使用されます。

  • プロパティが [StringLength] または [MaxLength] 属性で装飾され、許可される最大長 (.IsMaxLength) として定義された場合、属性は (可能な場合) 削除され、プロパティ値の長さはチェックされません。

上記の変更は、プロパティがいくつかの検証属性で装飾されている場合にのみ有効になることに注意してください。そのため、プロパティを必須 (.IsRequired()) に設定しても、プロパティは null 値に対して検証されません。EF 機能 CTP5: 検証
を参照してください。

2)簡単な修正ですが、Mystere Manが提案したように汚いものです
http://thedatafarm.com/blog/data-access/capturing-code-first-fluent-api-validationresults-to-display-in-mvc3-views/

http://bradwilson.typepad.com/blog/2010/10/service-location-pt6-model-validation.html

3)重いものエンタープライズライブラリの検証アプリケーションブロック
http://bradwilson.typepad.com/blog/2009/10/enterprise-library-validation-example-for-aspnet-mvc-2.htmlですが、エンタープライズライブラリは非常に多くの場合、やり過ぎと見なされます

4)バリデーションの涅槃: FluentValidationは非常に有望に見えます。私は間違いなく試してみます。
http://www.nuget.org/packages/FluentValidation.MVC3
短所: n 層アプリでは最善の方法ではありません。主にビューに焦点を当てています。

5) N 層
http://www.asp.net/mvc/tutorials/older-versions/models-(data)/validating-with-a-service-layer-cs
このアプローチは、クライアント側なので、個別に解決する必要があります。

于 2012-04-06T19:29:56.353 に答える