@@ -6,7 +6,8 @@ namespace Ivy.Database.Generator.Toolkit;
66
77public 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