当前位置: 移动技术网 > IT编程>开发语言>c# > C#实现根据实体类自动创建数据库表

C#实现根据实体类自动创建数据库表

2019年07月18日  | 移动技术网IT编程  | 我要评论

.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]特性,标注在需要设置主键的字段上

需要动态创建数据库的时候,可以从实体类中解析出表名、字段名、主键字段、字段说明等等,然后生成创建数据库表的脚本,动态创建数据库表

创建数据库的代码,后边可以进一步补充

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持移动技术网!

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网