一、环境说明
- 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}' 下的数据库表。");
}
}