在数据设计的时候会针对一些字段设置默认的值,Smark.Data同样支持这样的功能,组件通过在属性中描述一个Value属性来告诉组件这个值如果在没有设置的情况应该提供怎样的值。组件提供一个描述的基类,用户可以根据实际情况的需要扩展出具体的默认值描述,以下是值描述基础类:

    [AttributeUsage(AttributeTargets.Property)]public abstract class ValueAttribute:Attribute{public ValueAttribute(bool afterupdate){AfterByUpdate = afterupdate;   }public bool AfterByUpdate{get;set;}public virtual void Executing(IConnectinContext cc,object data,PropertyMapper pm,string table){}public virtual void Executed(IConnectinContext cc, object data, PropertyMapper pm, string table){}}

基础类有两个方法,一个是描述在数据操作前要做的工作,一个是描述数据操作后需要完成的工作。一般设置默认值都在数据操作之前的,为什么还要定义一个操作后的呢。其实有些情况的确要在数据操作后做,如果MSSQL自增ID就是添加后把相关ID值设置到对象中,这个时候就需要在数据操作完成后进行:

    [AttributeUsage(AttributeTargets.Property)]public class IDENTITY : ValueAttribute{public IDENTITY(): base(true){}public override void Executed(IConnectinContext cc, object data, PropertyMapper pm, string table){Command cmd = new Command("select @@IDENTITY ");object value = cc.ExecuteScalar(cmd);pm.Handler.Set(data,Convert.ChangeType( value,pm.Handler.Property.PropertyType));}}

如果想给一个属性设置一个默认的GUID值,用于主键可以这样做

    [AttributeUsage(AttributeTargets.Property)]public class UID:ValueAttribute{public UID() : base(false) { }public override void Executing(IConnectinContext cc, object data, PropertyMapper pm, string table){string uid = Guid.NewGuid().ToString("N");pm.Handler.Set(data, uid);}}

可以通过以下定义引用UID属性

        [ID][UID]string EmployeeID { get; set; }

在这基础上可以实现很多需要的默认值,以下是组件内部实现的默认值描述类

    [AttributeUsage(AttributeTargets.Property)]public class YearMonth : ValueAttribute{public YearMonth() : base(false) { }public override void Executing(IConnectinContext cc, object data, PropertyMapper pm, string table){pm.Handler.Set(data, DateTime.Now.Year.ToString("0000") + DateTime.Now.Month.ToString("00"));}}[AttributeUsage(AttributeTargets.Property)]public class Year : ValueAttribute{public Year() : base(false) { }public override void Executing(IConnectinContext cc, object data, PropertyMapper pm, string table){pm.Handler.Set(data, DateTime.Now.Year.ToString());}}[AttributeUsage(AttributeTargets.Property)]public class Month : ValueAttribute{public Month() : base(false) { }public override void Executing(IConnectinContext cc, object data, PropertyMapper pm, string table){pm.Handler.Set(data, DateTime.Now.Month.ToString());}}[AttributeUsage(AttributeTargets.Property)]public class Day : ValueAttribute{public Day() : base(false) { }public override void Executing(IConnectinContext cc, object data, PropertyMapper pm, string table){pm.Handler.Set(data, DateTime.Now.Day.ToString());}}[AttributeUsage(AttributeTargets.Property)]public class NowDate:ValueAttribute{public NowDate() : base(false) { }public override void Executing(IConnectinContext cc, object data, PropertyMapper pm, string table){pm.Handler.Set(data, DateTime.Now);}}[AttributeUsage(AttributeTargets.Property)]public class DefaultInt : ValueAttribute{private int mValue = 0;public DefaultInt(int value) : base(false) {mValue = value;}public override void Executing(IConnectinContext cc, object data, PropertyMapper pm, string table){pm.Handler.Set(data, mValue);}}[AttributeUsage(AttributeTargets.Property)]public class DefaultDecimal : ValueAttribute{private decimal mValue = 0;public DefaultDecimal(string value): base(false){mValue = Convert.ToDecimal(value);}public override void Executing(IConnectinContext cc, object data, PropertyMapper pm, string table){pm.Handler.Set(data,mValue);}}[AttributeUsage(AttributeTargets.Property)]public class DefaultString : ValueAttribute{ private string mValue = "";public DefaultString(string value): base(false){mValue = value;}public override void Executing(IConnectinContext cc, object data, PropertyMapper pm, string table){pm.Handler.Set(data, mValue);}}[AttributeUsage(AttributeTargets.Property)]public class DefaultDate:ValueAttribute{private DateTime mValue = DateTime.MinValue;public DefaultDate(string value): base(false){mValue =DateTime.Parse(value);}public override void Executing(IConnectinContext cc, object data, PropertyMapper pm, string table){pm.Handler.Set(data, mValue);}}[AttributeUsage(AttributeTargets.Property)]public class Enabled : ValueAttribute{public Enabled() : base(false) { }public override void Executing(IConnectinContext cc, object data, PropertyMapper pm, string table){pm.Handler.Set(data, true);}}

转载于:https://www.cnblogs.com/smark/archive/2012/08/18/2645424.html

Smark.Data实体默认值描述相关推荐

  1. Smark.Data 灵活的查询描述

    使用Smark.Data进行数据查询时必须通过对象来描述,其主要描述信息包括查询来源于那些表和需要那些信息等,即使平常的最常面对的关联查询,数据汇总查询等都可以通过实体描述来完成.因此实体描述在组件中 ...

  2. EntityFramework实体默认值遇到Oracle自增主键

    1. Oracle实现主键自动增长 一般我们在Oracle实现主键自动增长,通常通过序列加触发器实现. 定义序列用于获取递增数字 CREATE SEQUENCE 序列名[INCREMENT BY n] ...

  3. .net数据库连接池配置技巧(默认值)

    以连接字符串关键字控制Connection Pool ConnectionString属性是SQLConnection 对象的一个属性,它支持一个连接串/值对,这个对是用于调整connection p ...

  4. ant design 动态给a-input设置默认值

    ant design 动态给a-input设置默认值 描述一下我遇到的问题 在病种名称中输入内容,点击查询会打开一个新的form,需要把病种名称框中内容传到后面的text中 在弹窗中的a-input ...

  5. vue select js 设置默认值

    这个地方我是用vue进行渲染的select 对于每个选项如下: <div id="companylist"><label>所属公司</label> ...

  6. 输入框input type=“text“(获取值、设置默认值)

    <input type="text" class="form-control" id="name" placeholder=" ...

  7. Smark.Data 值转换器

    组件支持属性转换描述,主要用于对象属性值和数据存储之前的转换,如常见的枚举和数值,枚举和字符,用户密码等信息转换存储.实际上也可以扩展更灵活的转换如对象关联字段转换,对象序列化转等等. 在Smark. ...

  8. MySQL数据库建表时对于某个字段设置了默认值,但是使用Spring Data Jpa的save后默认值没有生效

    问题描述:MySQL数据库建表时对于某个字段设置了默认值,但是使用Spring Data Jpa的save后默认值没有生效.MySQL数据库中构建的用户表表结构如下所示: DROP TABLE IF ...

  9. java接口参数默认值_下面关于setMaxAge(int expires)方法参数默认值的描述中,正确的是(5.0分)_学小易找答案...

    [单选题]下面选项中,用于在web.xml中配置监听器的元素是(5.0分) [填空题]Cookie技术用于将会话过程中的数据保存到( )中,从而使浏览器和服务器可以更好地进行数据交互.(5.0分) [ ...

最新文章

  1. python属性访问顺序_Python 对象属性的访问
  2. reactjs组件的三大属性之props基本使用及props属性值检验
  3. 你真的了解Ioc与AOP 吗?(2)
  4. Spring Boot教程(11) – 理解注解@ControllerAdvice
  5. python编程理论_Python并发编程理论篇,来看看
  6. 解决思维导图软件Mindmanager Mindjet连接出错
  7. kettle资源库总是断开
  8. MinIO 快速入门
  9. 科来数据包生成器使用,广播域内进行arp欺骗
  10. Springboot实现remember-me记住我功能
  11. Html5网页录音,js录音mp3
  12. 新年第一天 | 恶补新一季《黑镜》的同时,营长又深入扒了扒它那擅长机器学习的新爸爸是如何赚钱的
  13. 什么意思中文_中文十级考题,请解释这四句话是什么意思!
  14. 【C++】【整活】鼠标抖动
  15. Linux——开发工具
  16. 多线程因__lll_unlock_elision 导致core
  17. 宗地权属图生成的解决方案设计
  18. 推荐12个优质技术公众号!
  19. 想哪写哪_随笔20191203
  20. App Icon Gear App 图标制作工具

热门文章

  1. W5500 NTP获取网络时间实现
  2. fluentd tail mysql_fluentd缓冲区Buffer(五)
  3. 运维实践-最新Nginx二进制构建编译lua-nginx-module动态链接Lua脚本访问Redis数据库读取静态资源隐式展现...
  4. C语言基本数据:实型
  5. 荷兰 转专业 计算机,【干货】关于荷兰留学转专业的!请看这里
  6. laradock 学习
  7. 性格测试分析软件,某种性格测试软件分析下的我——还是准呢。
  8. ABB机器人系统输入输出信号System Input和Output详解(二)
  9. Android黄油刀使用小记
  10. 关于华为的USG6000为什么不能ping通其他网络设备