.NET Core 将实体类转换为 SQL(ORM 映射)

一、环境说明

  • PostgreSQL 数据库
  • Npgsql 数据库连接库
  • SqlSugar ORM 框架

二、映射流程

1、创建数据库

检查指定数据库是否存在,如果不存在则创建数据库。

2、初始化 SqlSugar 实例

使用 SqlSugarClient 初始化数据库连接配置。

3、筛选实体类

根据指定的命名空间和排除条件筛选需要创建表的实体类。

4、创建表

使用 CodeFirst.InitTables 方法创建数据库表。

 /// <summary>
 /// 加载数据并初始化数据库表
 /// </summary>
 public class CreateDatabases
 {
     /// <summary>
     /// 加载数据并初始化数据库表
     /// </summary>
     public static void LoadData()
     {
         // 数据库连接字符串
         string connectionString = "Host=127.0.0.1;Port=5432;Username=postgres;Password=admin;";

         // 要创建的数据库名称 !!!注意这里对大小写不敏感!!!
         string databaseName = "databasename";

         // 连接到 PostgreSQL 服务器
         using (var connection = new NpgsqlConnection(connectionString))
         {
             connection.Open();

             // 检查数据库是否已经存在
             using (var checkCommand = new NpgsqlCommand($"SELECT 1 FROM pg_catalog.pg_database WHERE datname = '{databaseName}';", connection))
             {
                 bool databaseExists = checkCommand.ExecuteScalar() != null;

                 if (!databaseExists)
                 {
                     // 创建数据库
                     using (var createCommand = new NpgsqlCommand($"CREATE DATABASE {databaseName};", connection))
                     {
                         createCommand.ExecuteNonQuery();
                         Console.WriteLine($"数据库“{databaseName}”创建成功。");
                     }
                 }
                 else
                 {
                     Console.WriteLine($"数据库“{databaseName}”已经存在,跳过创建。");
                 }
             }
         }

         // 初始化 SQLSugar 实例
         var db = new SqlSugarClient(new ConnectionConfig
         {
             ConnectionString = $"{connectionString}Database={databaseName};Pooling=true;Maximum Pool Size=100",
             DbType = DbType.PostgreSQL,
             IsAutoCloseConnection = true,
         });

         // 指定命名空间
         string namespaceName = "CJ.Daangene.Infrastructure.Models";

         // 获取命名空间下的所有实体类的 Type 对象数组,排除掉不需要的类
         var entityTypes = Assembly.GetExecutingAssembly().GetTypes()
                                   .Where(t => t.Namespace == namespaceName && !IsExcluded(t))
                                   .ToArray();

         // 创建表
         db.CodeFirst.InitTables(entityTypes);

         // 判断某个类是否需要排除
         static bool IsExcluded(Type type)
         {
             // 排除名称为 "TransactionBase" 或者 "TransactionData" 等指定名称的类
             if (new[] { "TransactionBase", "TransactionData", "TransactionScope","EntityBase",
         }.Contains(type.Name))
             {
                 return true;
             }

             // 排除枚举类型
             if (type.IsEnum)
             {
                 return true;
             }

             // 排除名称为 "<>c" 或者 "<>c__DisplayClass0_0" 的类
             if (type.Name == "<>c" || type.Name == "<>c__DisplayClass0_0")
             {
                 return true;
             }

             return false; // 默认不排除
         }

         Console.WriteLine($"已初始化命名空间 '{namespaceName}' 下的数据库表。");
     }
 }

上一篇:蓝桥杯第一天


下一篇:ARM:汇编点灯