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环境
如何在建站之星网店版论坛获取技术支持?

