11using System ;
22using System . Data . Entity ;
33using System . IO ;
4- using System . Linq ;
54
65namespace SQLiteEfCodeFirstDbCreator
76{
8- public class SqliteContextInitializer < T > : IDatabaseInitializer < T >
9- where T : DbContext
7+ public class SqliteContextInitializer < TDbContext > : IDatabaseInitializer < TDbContext >
8+ where TDbContext : DbContext
109 {
11- private readonly bool dbExists ;
12- private readonly DbModelBuilder modelBuilder ;
10+ protected readonly bool dbExists ;
11+ protected readonly DbModelBuilder modelBuilder ;
1312
1413 public SqliteContextInitializer ( string connectionString , DbModelBuilder modelBuilder )
1514 {
16- string path = GetPathFromConnectionString ( connectionString ) ;
15+ string path = SqliteConnectionStringParser . GetDataSource ( connectionString ) ;
1716 dbExists = File . Exists ( path ) ;
1817 this . modelBuilder = modelBuilder ;
1918 }
2019
21- private string GetPathFromConnectionString ( string connectionString )
22- {
23- string [ ] keyValuePairs = connectionString . Split ( ';' ) ;
24- string dataSourceKeyValuePair = keyValuePairs . Single ( s => s . ToLower ( ) . StartsWith ( "data source" ) ) ;
25- string dataSourceValue = dataSourceKeyValuePair . Split ( '=' ) [ 1 ] ;
26- return dataSourceValue ;
27- }
28-
29- public void InitializeDatabase ( T context )
20+ public virtual void InitializeDatabase ( TDbContext context )
3021 {
3122 if ( dbExists )
23+ {
3224 return ;
25+ }
3326
3427 var model = modelBuilder . Build ( context . Database . Connection ) ;
3528
@@ -47,6 +40,22 @@ public void InitializeDatabase(T context)
4740 throw ;
4841 }
4942 }
43+
44+ using ( var transaction = context . Database . BeginTransaction ( ) )
45+ {
46+ try
47+ {
48+ Seed ( context ) ;
49+ transaction . Commit ( ) ;
50+ }
51+ catch ( Exception )
52+ {
53+ transaction . Rollback ( ) ;
54+ throw ;
55+ }
56+ }
5057 }
58+
59+ protected virtual void Seed ( TDbContext context ) { }
5160 }
52- }
61+ }
0 commit comments