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

 更新时间:2016年12月16日 14:40:56   作者:天碼行空  
本文主要介绍了C#通过自定义特性实现根据实体类自动创建数据库表的方法。具有很好的参考价值,需要的朋友一起来看下吧

.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#画笔Pen画虚线的方法

    C#画笔Pen画虚线的方法

    这篇文章主要介绍了C#画笔Pen画虚线的方法,涉及C#画笔Pen属性的相关设置技巧,需要的朋友可以参考下
    2015-06-06
  • C#将DataGridView中的数据保存到CSV和Excel中

    C#将DataGridView中的数据保存到CSV和Excel中

    这篇文章介绍了C#将DataGridView中的数据保存到CSV和Excel中的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-04-04
  • C#中的事务用法实例分析

    C#中的事务用法实例分析

    这篇文章主要介绍了C#中的事务用法,以一个简单实例形式分析了C#创建及使用事物的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-09-09
  • c#获取数组中最大数的值

    c#获取数组中最大数的值

    这篇文章主要介绍了c#获取数组中最大数的值,需要的朋友可以参考下
    2014-02-02
  • C#中foreach实现原理详解

    C#中foreach实现原理详解

    这篇文章主要为大家详细介绍了C#中foreach实现原理,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-09-09
  • C#解决SQlite并发异常问题的方法(使用读写锁)

    C#解决SQlite并发异常问题的方法(使用读写锁)

    这篇文章主要介绍了C#解决SQlite并发异常问题的方法,通过使用读写锁达到多线程安全访问,进而解决SQLite并发异常的问题,具有一定参考借鉴价值,需要的朋友可以参考下
    2016-07-07
  • 在C#语言里对NULL的技术处理小结

    在C#语言里对NULL的技术处理小结

    在 C# 中处理 null 值是编写可靠且可靠的代码的一个重要方面,在本文中,我将讨论一些在 C# 中处理 null 值的最常用技术,感兴趣的朋友跟随小编一起看看吧
    2024-05-05
  • C# Chart控件标记问题详解

    C# Chart控件标记问题详解

    这篇文章主要介绍了C# Chart控件标记问题详解,在做项目的时候,遇到一个需求,需要我对Chart图标标记数据正在运行,实现数据可视化,文章通过围绕主题展开详情,需要的朋友可以参考一下
    2022-08-08
  • 关于C# Math 处理奇进偶不进的实现代码

    关于C# Math 处理奇进偶不进的实现代码

    下面小编就为大家带来一篇关于C# Math 处理奇进偶不进的实现代码。小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-05-05
  • C#实现语音播报功能的示例详解

    C#实现语音播报功能的示例详解

    这篇文章主要为大家详细介绍了如何使用C#实现语音播报功能,文中的示例代码讲解详细,具有一定的借鉴价值,有需要的小伙伴可以参考一下
    2024-02-02

最新评论