ORM框架学习(三)
ORM框架学习-UPDATE数据
Update部分实现代码
public bool Update<T>(T t) where T : BaseModel { try { Type type = typeof(T); string conStr = "Server=127.0.0.1;Database=master; integrated security=SSPI"; string UpdateStr = SqlBuilder<T>.GetSql(SqlBuilder<T>.SqlType.UpdateSql); var sqlpara = type.GetProperties().Select(p => new SqlParameter("@" + p.GetMappingName(), p.GetValue(t) ?? DBNull.Value)).ToArray(); using (SqlConnection conn = new SqlConnection(conStr)) { SqlCommand cmd = new SqlCommand(UpdateStr, conn); cmd.Parameters.AddRange(sqlpara); conn.Open(); int result = cmd.ExecuteNonQuery(); return result > 0; } } catch (Exception ex) { throw new Exception(ex.Message); } }
该代码和之前的Insert和ADD代码类似,在Update这一块,主要的新点是:通过特性对更新的数据做过滤。因为在我们日常的需求中,需要对用户填写传到后台的数据做一些数据验证,检查这些数据是否符合规定,比如一些为空验证、长度限制验证。
程序入口代码如下所示
static void Main(string[] args) { SqlHelper help = new SqlHelper(); UserModel u1 = help.Query<UserModel>(1); Company com1 = help.Query<Company>(2); bool re1 = help.AddData(u1); bool re2 = help.AddData(com1); u1.Names = ""; if (!u1.Validate()) { Console.WriteLine("验证未通过!"); return; } bool re3 = help.Update(u1); }
调用数据验证的方法如图下图所示
Validate是一个泛型的方法,用来定义数据检查的,是一个扩展方法。代码实现如下所示:
public static class ValidateExtend { public static bool Validate<T>(this T t) { Type type=typeof(T); foreach (var prop in type.GetProperties()) { var val = prop.GetValue(t); if (prop.IsDefined(typeof(ThemeValidate), true)) { foreach (var item in prop.GetCustomAttributes<ThemeValidate>()) { if (!item.Validate(val)) { return false; } } } } return true; } }
如上代码所示,Validate方法是一个泛型的扩展方法,因为参数有this的存在,是一个扩展方法,所以可以直接通过对象来调用。为了便于今后扩展检查规则,我们抽象出来一个基类ThemeValidate,今后需要做验证的特性都需要继承自ThemeValidate类,ThemeValidate定义如下:
public abstract class ThemeValidate:Attribute { public abstract bool Validate(object obj); }
ThemeValidate只定义了一个抽象方法,该方法就对应子类的验证规则。下面我们来看两个ThemeValidate的子类定义
数据不能为空验证类ThemeRequireAttribute:
public class ThemeRequireAttribute : ThemeValidate { public override bool Validate(object obj) { if (obj == null || string.IsNullOrWhiteSpace(obj.ToString())) { return false; } return true; } }
验证数据长度的子类:ThemeAttributeStrLen
public class ThemeAttributeStrLen : ThemeValidate { private int _Min = 0; private int _Max= 0; public ThemeAttributeStrLen(int min, int max) { this._Min = min; this._Max = max; } public override bool Validate(object obj) { if (obj == null || string.IsNullOrWhiteSpace(obj.ToString()) || obj.ToString().Length > _Max || obj.ToString().Length < _Min) { return false; } return true; } }
目前我就定义了以上两个验证子类,今后需要扩展的就自行添加,只要限制继承自ThemeValidate就可以。
我们的验证特性已经定义好了,就是上面的两个子类(ThemeAttributeStrLen和ThemeRequireAttribute),接下来就要把这两个特性标记到实体类的字段属性中去。
在目前的代码中,对company和user实体都做了特性标记,user定义如下:
public partial class UserModel:BaseModel { [StringLength(50), ThemeColumn("Name")] [ThemeRequireAttribute] [ThemeAttributeStrLen(10, 50)] public string Names { get; set; } [Required] [StringLength(100)] public string Account { get; set; } [Required] [StringLength(100)] public string Password { get; set; } [StringLength(200)] public string Email { get; set; } [StringLength(30)] public string Mobile { get; set; } public int? CompanyId { get; set; } [StringLength(500)] public string CompanyName { get; set; } public int State { get; set; } public int UserType { get; set; } public DateTime? LastLoginTime { get; set; } public DateTime CreateTime { get; set; } public int CreatorId { get; set; } public int? LastModifierId { get; set; } public DateTime? LastModifyTime { get; set; } }
如上代码所示,如果一个属性有多个特性的话,如图所示定义:,该定义就表示Names字段包含四个特性StringLength、ThemeColumn、ThemeRequireAttribute、ThemeAttributeStrLen。
Company特性标记如下所示
public partial class Company:BaseModel { [StringLength(500)] [ThemeRequireAttribute] [ThemeAttributeStrLen(10,50)] public string Name { get; set; } [ThemeRequireAttribute] public DateTime CreateTime { get; set; } [ThemeRequireAttribute] public int CreatorId { get; set; } [ThemeRequireAttribute] public int? LastModifierId { get; set; } [ThemeRequireAttribute] public DateTime? LastModifyTime { get; set; } }
原文地址:https://www.cnblogs.com/zxwDont/p/11490081.html
- HDUOJ-4104 Discount
- HDUOJ-----1085Holding Bin-Laden Captive!
- HDUOJ-----1098 Ignatius's puzzle
- 转--shell脚本备份mysql数据库
- NYOJ——————数的长度(斯特林公式的应用)
- 关于ssh命令的几个使用小技巧(r11笔记第27天)
- Golang语言社区--消息触发服务器启动基础模块分享
- NYOJ------汉诺塔(一)
- HDUOJ----Coin Change
- Golang语言社区--列出目录和遍历目录的方法
- HDUOJ-------单词数
- insert导致的性能问题大排查(r11笔记第26天)
- NYOJ-----最少乘法次数
- nyOJ-----韩信点兵
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Ubuntu 18.04更换apt-get源的方法
- 浅谈Linux环境变量文件介绍
- linux创建线程之pthread_create的具体使用
- Ubuntu20.04安装搜狗输入法的详细步骤
- linux系统安装msf的过程详解
- Linux删除系统自带版本Python过程详解
- Linux时间子系统之时间的表示示例详解
- 如何在Linux中修改tomcat端口号
- centos7修改系统语言为简体中文的实现
- Linux 通过Rsync+Inotify实现本、异地远程数据实时同步功能
- linux实现猜数字小游戏源码
- linux编译kernel和svn版本冲突的解决办法
- 在 Ubuntu Linux 上安装 Oracle Java 14的方法
- 在 Linux 系统中手动滚动日志的方法
- Linux进程管理工具supervisor安装配置教程