parent
95aba3d268
commit
e3d3724ef6
@ -0,0 +1,23 @@
|
|||||||
|
using SqlSugar;
|
||||||
|
|
||||||
|
namespace Infrastructure.Seed;
|
||||||
|
|
||||||
|
public class DatabaseContext
|
||||||
|
{
|
||||||
|
public DatabaseContext(ISqlSugarClient sqlSugarClient)
|
||||||
|
{
|
||||||
|
if (sqlSugarClient is SqlSugarScope scope)
|
||||||
|
{
|
||||||
|
Database = scope;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public SqlSugarScope Database { get; private set; }
|
||||||
|
|
||||||
|
public DbType DbType { get; set; }
|
||||||
|
|
||||||
|
public SimpleClient<T> GetEntityDatabase<T>() where T : class, new()
|
||||||
|
{
|
||||||
|
return new SimpleClient<T>(Database);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,22 @@
|
|||||||
|
namespace Infrastructure.Seed;
|
||||||
|
|
||||||
|
public static class DatabaseContextExtensions
|
||||||
|
{
|
||||||
|
public static IServiceCollection GenerateTablesByClass<T>(this IServiceCollection services,
|
||||||
|
DatabaseSeed databaseSeed
|
||||||
|
) where T : class, new()
|
||||||
|
{
|
||||||
|
ArgumentNullException.ThrowIfNull(services);
|
||||||
|
databaseSeed.GenerateTablesByClass<T>();
|
||||||
|
return services;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static IServiceCollection GenerateSeedAsync<T>(this IServiceCollection services,
|
||||||
|
DatabaseSeed databaseSeed, string seedFile)
|
||||||
|
where T : class, new()
|
||||||
|
{
|
||||||
|
ArgumentNullException.ThrowIfNull(services);
|
||||||
|
databaseSeed.GenerateSeedAsync<T>(seedFile);
|
||||||
|
return services;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,76 @@
|
|||||||
|
using Infrastructure.Utils;
|
||||||
|
using SqlSugar;
|
||||||
|
|
||||||
|
namespace Infrastructure.Seed;
|
||||||
|
|
||||||
|
public class DatabaseSeed(DatabaseContext databaseContext, ILogger<DatabaseSeed> logger)
|
||||||
|
{
|
||||||
|
public void GenerateTablesByClass<T>() where T : class, new()
|
||||||
|
{
|
||||||
|
if (databaseContext.DbType == DbType.Oracle)
|
||||||
|
{
|
||||||
|
throw new InvalidOperationException("暂不支持Oracle数据库");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
databaseContext.Database.DbMaintenance.CreateDatabase();
|
||||||
|
}
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
var modelType = typeof(T);
|
||||||
|
var types = modelType.Assembly.DefinedTypes.Where(ti =>
|
||||||
|
ti.Namespace == modelType.Namespace
|
||||||
|
& ti.IsClass
|
||||||
|
&& ti.GetCustomAttribute<SugarTable>() != null)
|
||||||
|
.Select(ti => ti.AsType());
|
||||||
|
|
||||||
|
foreach (var type in types)
|
||||||
|
{
|
||||||
|
var tableName = type.GetCustomAttribute<SugarTable>()?.TableName ?? type.Name;
|
||||||
|
Console.WriteLine($"table is initializing: {tableName}");
|
||||||
|
databaseContext.Database.CodeFirst.InitTables(type);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
logger.LogError(e.Message);
|
||||||
|
throw;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public async void GenerateSeedAsync<T>(string seedFile) where T : class, new()
|
||||||
|
{
|
||||||
|
if (string.IsNullOrEmpty(seedFile))
|
||||||
|
{
|
||||||
|
throw new ArgumentException("Value cannot be null or empty.", nameof(seedFile));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!File.Exists(seedFile))
|
||||||
|
{
|
||||||
|
throw new ArgumentException("seed file not exist", nameof(seedFile));
|
||||||
|
}
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
if (await databaseContext.Database.Queryable<T>().AnyAsync())
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var json = await File.ReadAllTextAsync(seedFile, Encoding.UTF8);
|
||||||
|
if (string.IsNullOrEmpty(json))
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var data = json.Deserialize<List<T>>();
|
||||||
|
await databaseContext.GetEntityDatabase<T>().InsertRangeAsync(data);
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
logger.LogError(e.Message);
|
||||||
|
throw;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in new issue