学習のためのORMフレームワーク(III)

ORMフレームワークの学習データ-UPDATE

実装コードの一部を更新

公共 BOOL更新<T>(T T)ここで、T:BaseModel 
        { 

            試みる
            { 
                タイプtype = typeof演算(T)を、
                文字列コンストラクタ= " サーバー= 127.0.0.1;データベース=マスター;統合セキュリティ= SSPI " ;
                ストリング UpdateStr = SqlBuilder <T> .GetSql(SqlBuilder <T> .SqlType.UpdateSql)。
                するvar。sqlpara = type.GetProperties()を選択した(p => 新しい SqlParameter(" @ " + p.GetMappingName()、p.GetValue(T)?? DBNull.Valueの))てToArray();
                使用(SqlConnectionのCONN = 新しいSqlConnectionオブジェクト(コンストラクタ))
                { 
                    SqlCommandオブジェクトCMD = 新しいSqlCommandオブジェクト(UpdateStr、CONN)。
                    cmd.Parameters.AddRange(sqlpara)。
                    conn.Open(); 
                    int型の結果= cmd.ExecuteNonQuery()。
                    リターン結果> 0 ; 
                } 
            } 
            キャッチ(例外例)
            { 
                スロー 新しい例外(ex.Message)を、
            } 
        }

コードの挿入前にはアップデートで、このいずれかをコードし、同様のを追加し、主要な新しい点は次のとおりです。更新のデータ特性行うフィルタをそのため私たちの日常のニーズに、利用者の必要性は、これらのデータは、このようないくつかの空の検証、妥当性確認の長さの制限などの規定と一致しているかどうかを確認するために、いくつかのデータの検証を行うために戻って送信されるデータを記入します。

エントリコード次のように

静的 ボイドメイン(文字列[]引数)
        { 
            SqlHelperヘルプ = 新しいSqlHelper()。
            UserModel U1 = help.Query <UserModel>(1 )。
            会社COM1 = help.Query <会社>(2 )。
            BOOL RE1 = help.AddData(U1)。
            BOOL RE2 = help.AddData(COM1)。
            u1.Names = "" ;
            もし(!u1.Validate())
            { 
                Console.WriteLineを(" 验证未通过!");
                返します
            } 
            BOOL RE3 = help.Update(U1)。
        }

図に示した検証メソッド呼び出し。

 

 

検証は、データチェックを定義するために使用される一般的な方法である拡張メソッドです。次のようにコードの実装は次のとおりです。

パブリック 静的 クラスValidateExtend 
    { 
        パブリック 静的 ブール検証<T>(このT T)
        { 
            タイプtype = typeof演算(T)。
            foreachのVARの支柱type.GetProperties())
            { 
                VARのヴァル= prop.GetValue(T)。
                もし(prop.IsDefined(typeof演算(ThemeValidate)、))
                { 
                    foreachのVARの項目prop.GetCustomAttributes <ThemeValidate> ())
                    { 
                        場合(!)item.Validate(ヴァル)
                        { 
                            返す 
                        } 
                    } 
                } 
            } 
            戻り 
        } 
    }

コードに示されているように、検証拡張方法は、このパラメータの存在は、拡張メソッドであるため、それは物体によって直接呼び出すことができる、一般的な方法です。将来の拡張の検査ルールを容易にするために、我々は、基本クラスの抽象化ThemeValidateを将来のクラスは以下のように定義ThemeValidate、ThemeValidateから継承する必要があるの特性を検証するために行われる必要があります:

パブリック 抽象 クラスThemeValidate:属性
    { 
        パブリック 抽象 ブール検証(オブジェクトOBJ)。
    }

ThemeValidateのみ抽象メソッド、検証ルールのサブクラスに対応する、方法を定義します。2のサブクラスの定義を見てみましょうThemeValidate

ThemeRequireAttribute検証データが空のカテゴリにすることはできません。

パブリック クラスThemeRequireAttribute:ThemeValidate 
    { 

        公共 オーバーライド ブール検証(オブジェクトOBJ)
        { 
            場合(OBJ == NULL || .IsNullOrWhiteSpace(obj.ToStringは()))
            { 
                戻り 
            } 
            を返す 
        } 
    }

サブクラス認証データ長:ThemeAttributeStrLen

 パブリック クラスThemeAttributeStrLen:ThemeValidate 
    { 
        プライベート int型 _MIN = 0 ;
        プライベート int型 _max = 0 ;
        公共 ThemeAttributeStrLen(int型分、int型MAX)
        { 
            この ._Min = 分。
            この ._Max = 最大。
        } 
        公共 オーバーライド ブール検証(オブジェクトOBJ)
        { 
            場合(OBJ == NULL || ストリング.IsNullOrWhiteSpace(obj.ToString())|| obj.ToString()。長さ> _MAX || 。obj.ToString()長さ< _min)
            { 
                戻り 
            } 
            を返す 
        } 
    }

現在、私は2つ以上のサブクラスの検証を定義し、将来は制限がそれにThemeValidateから継承されている限り、追加するために自分自身を拡張する必要があります。

当社の検証機能は、2つのサブクラス(ThemeAttributeStrLenとThemeRequireAttribute)の上にある、定義されており、次のステップに行くために、エンティティクラスフィールドのこれらの二つの特性をマークすることです。

現在のコードでは、特性上の会社とユーザーエンティティは、以下のように、ユーザが定義され、作られたマーク:

パブリック 部分 クラスUserModel:BaseModel 
    { 

        [StringLengthに(50)、ThemeColumn(" 名前" )] 
        [ThemeRequireAttribute] 
        [ThemeAttributeStrLen(1050 )]
         パブリック 文字列名前{ 得ますセット; } 

        [必須] 
        [StringLengthの(100 )]
         パブリック 文字列アカウント{ 得ますセット; } 

        [必須] 
        [StringLengthの(100)]
         パブリック 文字列のパスワード{ 取得しますセット; } 

        [StringLengthに(200 )]
         パブリック 文字列メール{ 得ますセット; } 

        [StringLengthに(30 )]
         パブリック 文字列モバイル{ 得ますセット; } 

        公共の int型たCompanyId { 取得しますセット; } 

        [StringLengthに(500 )]
         パブリック 文字列得意{ 得ますセット; } 

        公共 のint州立{ 取得しますセット; } 

        公共 のintのUserType { 得ますセット; } 

        公共のDateTime?LastLoginTime { 取得しますセット; } 

        公共のDateTime CREATETIME { 得ますセット; } 

        公共 のint CreatorId { 得ますセット; } 

        公共の int型LastModifierId { 取得しますセット; } 

        公共のDateTime?LastModifyTime { 取得しますセット; } 
    }

コードのように特性が複数ある場合は、図に示すように、それが定義されている:このフィールドは含ま定義名前4つの特徴StringLengthに、ThemeColumn、ThemeRequireAttribute、ThemeAttributeStrLenを発現しました。

 

会社の特徴は次のようラベル示します

パブリック 部分 クラス会社:BaseModel 
    { 
        

        [StringLengthの(500 )] 
        [ThemeRequireAttribute] 
        [ThemeAttributeStrLen(1050 )]
         パブリック 文字列名前{ 得ますセット; } 

        [ThemeRequireAttribute] 
        公共のDateTime CREATETIME { 得ますセット; } 

        [ThemeRequireAttribute] 
        パブリック INT CreatorId { 得ますセット; } 

        [ThemeRequireAttribute] 
        公衆 int型LastModifierId { 取得しますセット; } 

        [ThemeRequireAttribute] 
        パブリック日時?LastModifyTime { 取得しますセット; } 
    }

 

おすすめ

転載: www.cnblogs.com/zxwDont/p/11490081.html