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(10、50 )] パブリック 文字列名前{ 得ます。セット; } [必須] [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(10、50 )] パブリック 文字列名前{ 得ます。セット; } [ThemeRequireAttribute] 公共のDateTime CREATETIME { 得ます。セット; } [ThemeRequireAttribute] パブリック INT CreatorId { 得ます。セット; } [ThemeRequireAttribute] 公衆 int型?LastModifierId { 取得します。セット; } [ThemeRequireAttribute] パブリック日時?LastModifyTime { 取得します。セット; } }