Skip to content

Commit fabe113

Browse files
committed
Refactoring and additional flexibility for the "SqliteContextInitializer"-class.
1 parent 5176827 commit fabe113

File tree

3 files changed

+60
-17
lines changed

3 files changed

+60
-17
lines changed

SQLiteEfCodeFirstDbCreator/SQLiteEfCodeFirstDbCreator.csproj

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,13 @@
99
<AppDesignerFolder>Properties</AppDesignerFolder>
1010
<RootNamespace>SQLiteEfCodeFirstDbCreator</RootNamespace>
1111
<AssemblyName>SQLiteEfCodeFirstDbCreator</AssemblyName>
12-
<TargetFrameworkVersion>v4.5.2</TargetFrameworkVersion>
12+
<TargetFrameworkVersion>v4.5.1</TargetFrameworkVersion>
1313
<FileAlignment>512</FileAlignment>
1414
<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
1515
<NuGetPackageImportStamp>b4e826ae</NuGetPackageImportStamp>
1616
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\</SolutionDir>
1717
<RestorePackages>true</RestorePackages>
18+
<TargetFrameworkProfile />
1819
</PropertyGroup>
1920
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
2021
<PlatformTarget>AnyCPU</PlatformTarget>
@@ -68,6 +69,7 @@
6869
<Compile Include="Builder\ForeignKeyCollectionBuilder.cs" />
6970
<Compile Include="Builder\CreateDatabaseStatementBuilder.cs" />
7071
<Compile Include="Properties\AssemblyInfo.cs" />
72+
<Compile Include="SqliteConnectionStringParser.cs" />
7173
<Compile Include="SqliteContextInitializer.cs" />
7274
<Compile Include="Builder\IStatementBuilder.cs" />
7375
<Compile Include="SqliteDatabaseCreator.cs" />
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
using System.Collections.Generic;
2+
3+
namespace SQLiteEfCodeFirstDbCreator
4+
{
5+
internal static class SqliteConnectionStringParser
6+
{
7+
private const char KeyValuePairSeperator = ';';
8+
private const char KeyValueSeperator = '=';
9+
private const int KeyPosition = 0;
10+
private const int ValuePosition = 1;
11+
12+
public static IDictionary<string, string> ParseSqliteConnectionString(string connectionString)
13+
{
14+
connectionString = connectionString.Trim();
15+
string[] keyValuePairs = connectionString.Split(KeyValuePairSeperator);
16+
17+
IDictionary<string, string> keyValuePairDictionary = new Dictionary<string, string>();
18+
foreach (var keyValuePair in keyValuePairs)
19+
{
20+
string[] keyValue = keyValuePair.Split(KeyValueSeperator);
21+
keyValuePairDictionary.Add(keyValue[KeyPosition], keyValue[ValuePosition]);
22+
}
23+
24+
return keyValuePairDictionary;
25+
}
26+
27+
public static string GetDataSource(string connectionString)
28+
{
29+
return ParseSqliteConnectionString(connectionString)["data source"];
30+
}
31+
}
32+
}
Lines changed: 25 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,35 +1,28 @@
11
using System;
22
using System.Data.Entity;
33
using System.IO;
4-
using System.Linq;
54

65
namespace 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

Comments
 (0)