MySql主键自动生成,表、实体、C#调用方法

1.表:mysql建表语句

DROP TABLE IF EXISTS `keycode`;
CREATE TABLE `keycode` (
`Id` int(11) NOT NULL AUTO_INCREMENT,
`KeyName` varchar(50) NOT NULL,
`KeyRemark` varchar(100) NOT NULL,
`Prefix` varchar(20) DEFAULT NULL,
`ReSetType` int(11) NOT NULL,
`DateFormat` longtext,
`Length` int(11) NOT NULL,
`Step` int(11) NOT NULL,
`InitialValue` int(11) NOT NULL,
`NowDate` longtext,
`CurrentValue` int(11) NOT NULL
PRIMARY KEY (`Id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;

2.实体:Entity

/// <summary>
/// 自动生成不重复流水号
/// </summary>
public class KeyCode
{
/// <summary>
/// 键名称
/// </summary>
[Required, MaxLength(50)]
public string KeyName { get; set; }

/// <summary>
/// 键说明
/// </summary>
[Required, MaxLength(100)]
public string KeyRemark { get; set; }

/// <summary>
/// 前标字母
/// </summary>
[MaxLength(20)]
public string Prefix { get; set; }

/// <summary>
/// 重置类型:0不重置 1重置
/// </summary>
public int ReSetType { get; set; }

/// <summary>
/// 日期格式 日期格式格式可以是yyyymm,yy-mm,yyyymmdd,yyyymmdd-hh等,
/// 如果按年重置,则日期格式中必须有年,如果按月重置,则日期格式中必须有月.
/// 如果日期格式为空:则编号中不加入日期字段
/// </summary>
public string DateFormat { get; set; }

/// <summary>
/// 流水号长度:如长度为4,当前流水号为123,则出来的编码为0123,不足4位的前面补0
/// </summary>
public int Length { get; set; }

/// <summary>
/// 步长 每个流水号生成间隔是多少,如2,表示每个生成0001,0003这种流水号';
/// </summary>
public int Step { get; set; }

/// <summary>
/// 初始值 初始流水号是多少,默认是0
/// </summary>
public int InitialValue { get; set; }

/// <summary>
/// 当前使用的日期【需更新】
/// </summary>
public string NowDate { get; set; }

/// <summary>
/// 当前流水号【需更新】 流水号当前值,如234表示当前的流水号生成到了234,下一个为234+STEP(步长)';
/// </summary>
public int CurrentValue { get; set; }

}

 

3.C#调用方法

/// <summary>
/// 不重复编码生成
/// </summary>
/// <param name="keyName"></param>
/// <returns></returns>
public string GetKeyCode(string keyName)
{
string returnKey = "";
KeyCode key = _keyRepository.FirstOrDefault(k => k.KeyName == keyName);
//步长
int step = key.Step <= 0 ? 1 : key.Step;

//如果日期格式化为空:表示编码不需要日期
if (string.IsNullOrEmpty(key.DateFormat))
key.NowDate = "";
else
key.NowDate = DateTime.Now.ToString(key.DateFormat);

//重置类型: 0不重置,1重置
//不重置:后面序号一直增加,不按年月日重置
if (key.ReSetType == 0)
key.CurrentValue = key.CurrentValue <= 0 ? 1 : (key.CurrentValue + step);
//重置:年月日变化时,会重新从1开始
else
{
//如果日期不一样了,序号从1开始
if (!string.IsNullOrEmpty(key.NowDate) &&key.NowDate != DateTime.Now.ToString(key.DateFormat))
key.CurrentValue = key.InitialValue <= 0 ? 0 : key.InitialValue;
//否则,序号从原序号+step
else
key.CurrentValue = key.CurrentValue <= 0 ? 1 : (key.CurrentValue + step);
}

//更新当前值为新的值;
_keyRepository.Update(key);
//拼接编码
string newCode = key.CurrentValue.ToString().PadLeft(key.Length, '0');
returnKey = key.Prefix + key.NowDate + newCode;
return returnKey;
}

 

posted @ 2017-09-28 15:07  下雨天的马甲  阅读(1369)  评论(0编辑  收藏  举报