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

发布时间 - 2026-01-10 21:53:18    点击率:

.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#  # 实体类创建数据库表  # 实体类和数据库表  # C# http系列之以form-data方式上传多个文件及键值对集合到远程服务器  # C# 使用multipart form-data方式post数据到服务器  # C#后端接收form-data  # 创建实体类教程  # 主键  # 自定义  # 类中  # 我们可以  # 是一个  # 这是  # 两种  # 怎么做  # 可以看出  # 什么问题  # 本节  # 字段名  # 实体类  # ID  # CustomerAttribute  # namespace  # UserId  # RoleId  # Program  # typeparam 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 夸克浏览器网页跳转延迟怎么办 夸克浏览器跳转优化  如何在局域网内绑定自建网站域名?  如何在阿里云香港服务器快速搭建网站?  如何在香港免费服务器上快速搭建网站?  Laravel怎么做数据加密_Laravel内置Crypt门面的加密与解密功能  Laravel如何实现文件上传和存储?(本地与S3配置)  uc浏览器二维码扫描入口_uc浏览器扫码功能使用地址  如何用JavaScript实现文本编辑器_光标和选区怎么处理  如何快速辨别茅台真假?关键步骤解析  php中::能调用final静态方法吗_final修饰静态方法调用规则【解答】  网站制作报价单模板图片,小松挖机官方网站报价?  html5源代码发行怎么设置权限_访问权限控制方法与实践【指南】  Laravel怎么使用Session存储数据_Laravel会话管理与自定义驱动配置【详解】  小视频制作网站有哪些,有什么看国内小视频的网站,求推荐?  如何在 Go 中优雅地映射具有动态字段的 JSON 对象到结构体  邀请函制作网站有哪些,有没有做年会邀请函的网站啊?在线制作,模板很多的那种?  如何将凡科建站内容保存为本地文件?  Laravel如何使用Gate和Policy进行授权?(权限控制)  php后缀怎么变mp4格式错误_修改扩展名提示格式不对怎么办【技巧】  Laravel Eloquent性能优化技巧_Laravel N+1查询问题解决  Laravel如何获取当前用户信息_Laravel Auth门面获取用户ID  Laravel怎么集成Log日志记录_Laravel单文件与每日日志配置及自定义通道【详解】  JavaScript常见的五种数组去重的方式  如何用AWS免费套餐快速搭建高效网站?  EditPlus中的正则表达式实战(5)  Laravel怎么判断请求类型_Laravel Request isMethod用法  如何在Tomcat中配置并部署网站项目?  猎豹浏览器开发者工具怎么打开 猎豹浏览器F12调试工具使用【前端必备】  网站图片在线制作软件,怎么在图片上做链接?  浅述节点的创建及常见功能的实现  如何在新浪SAE免费搭建个人博客?  详解免费开源的.NET多类型文件解压缩组件SharpZipLib(.NET组件介绍之七)  Chrome浏览器标签页分组怎么用_谷歌浏览器整理标签页技巧【效率】  千问怎样用提示词获取健康建议_千问健康类提示词注意事项【指南】  如何为不同团队 ID 动态生成多个独立按钮  JavaScript如何实现错误处理_try...catch如何捕获异常?  Laravel如何正确地在控制器和模型之间分配逻辑_Laravel代码职责分离与架构建议  高性能网站服务器部署指南:稳定运行与安全配置优化方案  学生网站制作软件,一个12岁的学生写小说,应该去什么样的网站?  轻松掌握MySQL函数中的last_insert_id()  javascript读取文本节点方法小结  微信小程序 配置文件详细介绍  怎么制作网站设计模板图片,有电商商品详情页面的免费模板素材网站推荐吗?  Laravel如何集成第三方登录_Laravel Socialite实现微信QQ微博登录  南京网站制作费用,南京远驱官方网站?  Laravel如何使用withoutEvents方法临时禁用模型事件  如何在IIS服务器上快速部署高效网站?  Linux系统运维自动化项目教程_Ansible批量管理实战  使用Dockerfile构建java web环境  如何在建站之星网店版论坛获取技术支持?