Skip to content

Commit 31eb3e8

Browse files
committed
feat: add options to delete and seed database during generation
1 parent 151a362 commit 31eb3e8

File tree

1 file changed

+55
-10
lines changed

1 file changed

+55
-10
lines changed

Ivy.Database.Generator.Toolkit/DatabaseGenerator.cs

Lines changed: 55 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,8 @@ namespace Ivy.Database.Generator.Toolkit;
66

77
public class DatabaseGenerator
88
{
9-
public async Task<int> GenerateAsync(Type dataContextType, Type dataSeederType, bool verbose, bool yesToAll, string? projectDirectory, string? connectionString, DatabaseProvider? providerChoice)
9+
public async Task<int> GenerateAsync(Type dataContextType, Type dataSeederType, bool verbose, bool yesToAll, bool deleteDatabase, bool seedDatabase, string? projectDirectory,
10+
string? connectionString, DatabaseProvider? providerChoice)
1011
{
1112
providerChoice ??= AnsiConsole.Prompt(
1213
new SelectionPrompt<DatabaseProvider>()
@@ -31,7 +32,7 @@ public async Task<int> GenerateAsync(Type dataContextType, Type dataSeederType,
3132
).Trim();
3233
}
3334

34-
if (!yesToAll)
35+
if (!deleteDatabase && !yesToAll)
3536
{
3637
var continuePrompt = AnsiConsole.Prompt(
3738
new ConfirmationPrompt("This will delete and recreate the database. Are you sure you want to continue?")
@@ -45,18 +46,58 @@ public async Task<int> GenerateAsync(Type dataContextType, Type dataSeederType,
4546
AnsiConsole.MarkupLine("[red]Aborted![/]");
4647
return 1;
4748
}
49+
deleteDatabase = true;
4850
}
4951

5052
var dbContext = (DbContext)databaseProvider.GetType().GetMethod("GetDbContext")!.MakeGenericMethod(dataContextType).Invoke(databaseProvider,
5153
[connectionString])!;
5254

5355
await Utils.WithSpinner(async () =>
5456
{
55-
await dbContext.Database.EnsureDeletedAsync();
57+
if (deleteDatabase)
58+
{
59+
await dbContext.Database.EnsureDeletedAsync();
60+
}
61+
else
62+
{
63+
// Check if the database exists and has tables
64+
if (await dbContext.Database.CanConnectAsync())
65+
{
66+
// Try to check if any entity sets have data
67+
bool hasData = false;
68+
foreach (var entityType in dbContext.Model.GetEntityTypes())
69+
{
70+
var clrType = entityType.ClrType;
71+
var setMethod = dbContext.GetType().GetMethod("Set", Type.EmptyTypes)?.MakeGenericMethod(clrType);
72+
if (setMethod != null)
73+
{
74+
dynamic? dbSet = setMethod.Invoke(dbContext, null);
75+
try
76+
{
77+
// Try to count records - will fail if table doesn't exist
78+
if (await dbSet?.AnyAsync()!)
79+
{
80+
hasData = true;
81+
break;
82+
}
83+
}
84+
catch
85+
{
86+
// Table doesn't exist, which is fine
87+
}
88+
}
89+
}
90+
91+
if (hasData)
92+
{
93+
throw new InvalidOperationException("Database is not empty.");
94+
}
95+
}
96+
}
5697
await dbContext.Database.EnsureCreatedAsync();
5798
}, "Creating Tables", verbose);
5899

59-
if (!yesToAll)
100+
if (!seedDatabase && !yesToAll)
60101
{
61102
var seedPrompt = AnsiConsole.Prompt(
62103
new ConfirmationPrompt("Seed database with bogus data?")
@@ -69,14 +110,18 @@ await Utils.WithSpinner(async () =>
69110
{
70111
return 0;
71112
}
113+
seedDatabase = true;
72114
}
73-
74-
var seeder = (IDataSeeder)Activator.CreateInstance(dataSeederType, dbContext)!;
75-
76-
await Utils.WithSpinner(async () =>
115+
116+
if (seedDatabase)
77117
{
78-
await seeder.SeedAsync();
79-
}, "Seeding", verbose);
118+
var seeder = (IDataSeeder)Activator.CreateInstance(dataSeederType, dbContext)!;
119+
120+
await Utils.WithSpinner(async () =>
121+
{
122+
await seeder.SeedAsync();
123+
}, "Seeding", verbose);
124+
}
80125

81126
AnsiConsole.MarkupLine($"[green]Done![/]");
82127

0 commit comments

Comments
 (0)