C#实现根据实体类自动创建数据库表
程序员文章站
2022-07-02 22:06:44
.net新手通常容易把属性(property)跟特性(attribute)搞混,其实这是两种不同的东西
属性指的类中封装的数据字段;而特性是对类、字段、方法和属性等元素标...
.net新手通常容易把属性(property)跟特性(attribute)搞混,其实这是两种不同的东西
属性指的类中封装的数据字段;而特性是对类、字段、方法和属性等元素标注的声明性信息
如下代码(id、name为user的属性,[dbkey]为id的特性)
/// <summary> /// 用户信息 /// </summary> public class user { [dbkey] public string id { get; set; } public string name { get; set; } }
特性分预定义特性和自定义特性,本节主要讲述自定义特性
特性能解决什么问题?
假如现在需要通过定义一些实体类,动态创建出对应的数据库表,该怎么做呢?
直接上代码
namespace customerattribute { /// <summary> /// 数据库主键 /// </summary> public class dbkey : attribute { public string description { get; set; } public dbkey() { } public dbkey(string description) { this.description = description; } } }
namespace customerattribute { /// <summary> /// 用户信息 /// </summary> public class user { [dbkey] public string id { get; set; } public string name { get; set; } } /// <summary> /// 用户角色 /// </summary> public class userrole { [dbkey("用户id")] public string userid { get; set; } [dbkey("角色id")] public string roleid { get; set; } } }
namespace customerattribute { class program { /// <summary> /// 获取数据库主键字段 /// </summary> /// <typeparam name="t"></typeparam> /// <returns></returns> private static ienumerable<propertyinfo> getdbkeyfields<t>() { // 获取当前类中的公共字段 var fields = typeof(t).getproperties(); // 查找有dbkey特性的字段 var keyfields = fields.where(field => (dbkey)attribute.getcustomattribute(field, typeof(dbkey)) != null); return keyfields; } private static string getdescription(propertyinfo field) { string result = string.empty; var dbkey = (dbkey)attribute.getcustomattribute(field, typeof(dbkey)); if (dbkey != null) result = dbkey.description; return result; } static void main(string[] args) { try { var userkeyfields = getdbkeyfields<user>(); console.writeline("user表的主键为:" + string.join(",", userkeyfields.select(field => field.name))); var userrolekeyfields = getdbkeyfields<userrole>(); console.writeline("userrole表的主键为:" + string.join(",", userrolekeyfields.select(field => field.name))); foreach (propertyinfo field in userrolekeyfields) { string description = getdescription(field); console.writeline(string.format("{0}字段的描述信息为:{1}", field.name, description)); } } catch (exception ex) { console.writeline(ex); } finally { console.readline(); } } } }
从上边代码可以看出来,特性本身也是类,继承自attribute类,我们可以对类、方法、属性等元素进行特性标注
上边是一个简单示例,我们可以通过自定义[dbkey]特性,标注在需要设置主键的字段上
需要动态创建数据库的时候,可以从实体类中解析出表名、字段名、主键字段、字段说明等等,然后生成创建数据库表的脚本,动态创建数据库表
创建数据库的代码,后边可以进一步补充
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持!
上一篇: 哈哈笑乐一乐卸货
下一篇: C#如何给PDF文件添加水印