磨刀不误砍柴工。有些代码 写起来没有什么技术含量,而且重复费时,又有一定的规律性,对于这样的代码就想要把他们自动生成,提高生产效率。
从数据表生成实体的代码生成器就是这样一个可以提高编码效率的工具。网上一搜索就发现有不少这样的工具,而且非常不错,给码农节省很多宝贵时间。
一、原理
我也做一个这样的工具来玩玩。实现的原理很简单,数据库的系统数据库保存管理着用户建立的表、视图、字段等等的元数据,然后通过这些元数据使用SQL查询的方式,生成数据库表对应的实体对象程序代码。
二、数据库表定义
时间关系,不做太多解说,直接列出如下代码,这里假设数据库中建立一个表名为PROJECT_INFO的数据表。
表的字段:RECORD_ID,PROJECT_ID,PROJECT_NAME,USER_TYPE,USER_ID
三、生成实体代码的代码
sql代码基于sql server2016以上。
1)关键代码。这段代码可以写成一个存储过程,传入一个表名作为参数。
select
'/*/// <summary>' + cast(isnull(ep.value,'') as nvarchar(100)) + '</summary>*/' + CHAR('13')
+ ' public '
+ (case
when st.name= 'bigint' then 'long'
when st.name= 'datetime' or st.name= 'datetime2' then 'DateTime'
when st.name= 'decimal' or st.name= 'numeric' or st.name= 'float' then 'decimal'
when st.name= 'int' then 'int'
when st.name= 'nvarchar' or st.name= 'varchar' or st.name= 'nchar' or st.name= 'char' then 'string'
when st.name= 'tinyint' then 'int'
when st.name= 'binary' or st.name= 'varbinary' then 'byte []'
else 'string'
end)
+ ' ' + dbo.FUN_ToCamelName(c.name) + ' {get;set;}'
from sys.all_columns c
left join sys.extended_properties ep on c.object_id = ep.major_id and c.column_id = ep.minor_id
left join sys.systypes st on st.xusertype = c.user_type_id
where c.object_id = object_id(N'PROJECT_INFO')
2)转换带下划线的字段命名为驼峰命名
CREATE function [dbo].[FUN_ToCamelName](
@expression varchar(200)
)
RETURNS varchar(200)
as
begin
set @expression = LOWER(@expression);
declare @passcalName varchar(200)
set @passcalName = ''
select @passcalName = @passcalName + Stuff(v.value,1,1,upper(substring(v.value,1,1))) from string_split(@expression,'_') as v
return @passcalName
end
四、效果
C#代码:
/// <summary>记录ID</summary>
public long RecordId {get;set;}
/// <summary>项目ID</summary>
public int ProjectId {get;set;}
/// <summary>项目名称</summary>
public string ProjectName {get;set;}
/// <summary>用户类型</summary>
public int UserType {get;set;}
/// <summary>用户ID</summary>
public int UserId {get;set;}
五、不足与改进
这是一个简易的半自动的代码生成工具。
可以根据需要在每个实体字段属性上加入一些特性签名,比如,[DataMember(IsRequire=false)],[StringLength(50)]等等。