LINQからSQL生成クラスへの拡張

私はASP.NET MVC3プロジェクトのORMフレームワークとしてLINQ to SQLを選びました。登録フォームに「Confirm Password」フィールドを追加する必要がある前に、すべてがうまくいっていました。私は現時点で見つけることができませんでしたので、検証属性を格納するための別のクラスを用意するのではなく、生成されたLINQを検証クラスでSQLクラスに拡張することをお勧めします。だからここに行く:

public interface IRegTry
    {
        [Required]
        [Email]
        string EMail { get; set; }

        [Required]
        [StringLength(100, ErrorMessage = "Should not exceed 100 symbols")]
        string FirstName { get; set; }

        [Required]        
        string Password { get; set; }        

    }

    [MetadataType(typeof(IRegTry))]
    public partial class RegTry : IRegTry { }

RegTry class is generated class by LINQ to SQL based on database entity.

[パスワードを確認してください]フィールドに、2つの入力パスワードが同じであることを確認する必要があります。

ここで追加します:

public class RegTryViewModel : RegTry
{
    [Required]
    [EqualTo("Password", ErrorMessage = "You should type two identical passwords to continue")]
    public string ConfirmPassword { get; set; }
}

Viewは、 RegTryViewModel モデルで厳密に型指定されたビューです。

私はちょうど私がここにすべてを正しくしていることを確認するために頼む。私に不快感を与えているのは、 IRegTry インターフェースと RegTryViewModel クラスの間にバリデーションロジックを広げていることです。しかし、ベースSQLからLINQクラスにはまったくないので、 IRegTry インターフェースに ConfirmPassword プロパティを追加することはできません。 事前にみんなありがとう!

0

2 答え

私はあなたがすでにこの答えを受け入れていることを知っていますが、 partial クラスを使ってこれを設定するほうが良いかもしれないと思います。同じ名前の同じ名前空間 partial クラスを設定する限り、すべてが自動的に設定されます。プロジェクトの1つでこれを設定する方法の例を次に示します。

namespace OperationsMetrics
{
[MetadataType(typeof(ClientStatMD))]
public partial class client_wkly_stat : IValidatableObject
{
    public class ClientStatMD
    {
        [Required(ErrorMessage = "Client selection is required")]
        public virtual int client_id { get; set; }
        [Required(ErrorMessage = "SLAs met is required")]
        public virtual int wkly_sla_met { get; set; }
        [Required(ErrorMessage = "Total SLAs possible is required")]
        public virtual int wkly_sla_req { get; set; }
        [Required(ErrorMessage = "Number of input files is received")]
        public virtual int num_inp_files_rec { get; set; }
        [Required]
        public string client_name { get; set; } 

    }

    public IEnumerable Validate(ValidationContext validationContext)
    {
        if (wkly_sla_met > wkly_sla_req)
        {
            yield return new ValidationResult("SLAs met cannot be greater that SLAs possible");
        }


    }
    public string client_name { get; set; } //this isn't a part of the actual db object but can still be accessed in the Validate method
}

}

パーシャルクラスは独自の Validate メソッドを実装する IValidatableObject として設定できます。 Validateメソッドで Confirm == Password をチェックすることができます。

You can get some more information in this Pluralsight Video

1
追加された
有効なリンクが利用可能な場合、PluralSightのリンクが壊れています
追加された 著者 Mrinal Kamboj,

View Modelクラスを使用している場合は、DAL Modelクラスに接続された検証ロジックを必要としないため、DAL Modelクラスにリンクされた検証インターフェイスは必要ありません。

1
追加された
しかし、私がまだユニットテスト目的のためのインタフェースが必要な場合は、どうすればよいでしょうか?
追加された 著者 kseen,
はい、分かりました。あなたはそれのためのコードのサンプルを提供していただけますか?私は少しイライラしました。
追加された 著者 kseen,
私は依然としてバリデーション・ロジックをバリデーション・クラスだけに接続したままにしておきます。 DALクラスがモデルバインダーに/からモデルバインダーを渡さない場合、検証ロジックを持つ必要はありません。
追加された 著者 Andrew Barber,