Skip to content

Commit f1449d9

Browse files
committed
feat: expose default collation through the public initializers
SqliteInitializerBase already accepts a default Collation and feeds it into SQL generation, but none of the three concrete initializers forwarded it, so the documented "default collation" feature was unreachable without subclassing. Add constructor overloads that pass a Collation to the base class.
1 parent 82c1e25 commit f1449d9

4 files changed

Lines changed: 117 additions & 9 deletions

File tree

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
using System.Data.Entity;
2+
using Microsoft.VisualStudio.TestTools.UnitTesting;
3+
using SQLite.CodeFirst.NetCore.Console;
4+
5+
namespace SQLite.CodeFirst.Test.UnitTests.DbInitializers
6+
{
7+
/// <summary>
8+
/// Verifies that the public initializers forward an explicitly supplied default
9+
/// <see cref="Collation"/> to the base class, which is what feeds it into the SQL generation.
10+
/// Without this the documented "default collation" feature is unreachable through the shipped initializers.
11+
/// </summary>
12+
[TestClass]
13+
public class InitializerDefaultCollationTest
14+
{
15+
private static readonly Collation Collation = new Collation(CollationFunction.RTrim);
16+
17+
private static DbModelBuilder NewModelBuilder()
18+
{
19+
return new DbModelBuilder();
20+
}
21+
22+
[TestMethod]
23+
public void SqliteCreateDatabaseIfNotExists_ForwardsDefaultCollation()
24+
{
25+
var initializer = new SqliteCreateDatabaseIfNotExists<FootballDbContext>(NewModelBuilder(), Collation);
26+
Assert.AreSame(Collation, initializer.DefaultCollation);
27+
}
28+
29+
[TestMethod]
30+
public void SqliteCreateDatabaseIfNotExists_WithNullByteFlag_ForwardsDefaultCollation()
31+
{
32+
var initializer = new SqliteCreateDatabaseIfNotExists<FootballDbContext>(NewModelBuilder(), true, Collation);
33+
Assert.AreSame(Collation, initializer.DefaultCollation);
34+
}
35+
36+
[TestMethod]
37+
public void SqliteDropCreateDatabaseAlways_ForwardsDefaultCollation()
38+
{
39+
var initializer = new SqliteDropCreateDatabaseAlways<FootballDbContext>(NewModelBuilder(), Collation);
40+
Assert.AreSame(Collation, initializer.DefaultCollation);
41+
}
42+
43+
[TestMethod]
44+
public void SqliteDropCreateDatabaseWhenModelChanges_ForwardsDefaultCollation()
45+
{
46+
var initializer = new SqliteDropCreateDatabaseWhenModelChanges<FootballDbContext>(NewModelBuilder(), Collation);
47+
Assert.AreSame(Collation, initializer.DefaultCollation);
48+
}
49+
50+
[TestMethod]
51+
public void SqliteDropCreateDatabaseWhenModelChanges_WithHistoryType_ForwardsDefaultCollation()
52+
{
53+
var initializer = new SqliteDropCreateDatabaseWhenModelChanges<FootballDbContext>(NewModelBuilder(), typeof(History), Collation);
54+
Assert.AreSame(Collation, initializer.DefaultCollation);
55+
}
56+
57+
[TestMethod]
58+
public void Initializer_WithoutCollation_HasNullDefaultCollation()
59+
{
60+
var initializer = new SqliteDropCreateDatabaseAlways<FootballDbContext>(NewModelBuilder());
61+
Assert.IsNull(initializer.DefaultCollation);
62+
}
63+
}
64+
}

SQLite.CodeFirst/Public/DbInitializers/SqliteCreateDatabaseIfNotExists.cs

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,16 @@ public class SqliteCreateDatabaseIfNotExists<TContext> : SqliteInitializerBase<T
1919
/// </summary>
2020
/// <param name="modelBuilder">The model builder.</param>
2121
public SqliteCreateDatabaseIfNotExists(DbModelBuilder modelBuilder)
22-
: this(modelBuilder, false)
22+
: this(modelBuilder, false, null)
23+
{ }
24+
25+
/// <summary>
26+
/// Initializes a new instance of the <see cref="SqliteCreateDatabaseIfNotExists{TContext}"/> class.
27+
/// </summary>
28+
/// <param name="modelBuilder">The model builder.</param>
29+
/// <param name="defaultCollation">The default collation applied to all string columns. Explicit <see cref="CollateAttribute"/>s take precedence.</param>
30+
public SqliteCreateDatabaseIfNotExists(DbModelBuilder modelBuilder, Collation defaultCollation)
31+
: this(modelBuilder, false, defaultCollation)
2332
{ }
2433

2534
/// <summary>
@@ -28,7 +37,17 @@ public SqliteCreateDatabaseIfNotExists(DbModelBuilder modelBuilder)
2837
/// <param name="modelBuilder">The model builder.</param>
2938
/// <param name="nullByteFileMeansNotExisting">if set to <c>true</c> a null byte database file is treated like the database does not exist.</param>
3039
public SqliteCreateDatabaseIfNotExists(DbModelBuilder modelBuilder, bool nullByteFileMeansNotExisting)
31-
: base(modelBuilder)
40+
: this(modelBuilder, nullByteFileMeansNotExisting, null)
41+
{ }
42+
43+
/// <summary>
44+
/// Initializes a new instance of the <see cref="SqliteCreateDatabaseIfNotExists{TContext}"/> class.
45+
/// </summary>
46+
/// <param name="modelBuilder">The model builder.</param>
47+
/// <param name="nullByteFileMeansNotExisting">if set to <c>true</c> a null byte database file is treated like the database does not exist.</param>
48+
/// <param name="defaultCollation">The default collation applied to all string columns. Explicit <see cref="CollateAttribute"/>s take precedence.</param>
49+
public SqliteCreateDatabaseIfNotExists(DbModelBuilder modelBuilder, bool nullByteFileMeansNotExisting, Collation defaultCollation)
50+
: base(modelBuilder, defaultCollation)
3251
{
3352
this.nullByteFileMeansNotExisting = nullByteFileMeansNotExisting;
3453
}

SQLite.CodeFirst/Public/DbInitializers/SqliteDropCreateDatabaseAlways.cs

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,16 @@ public class SqliteDropCreateDatabaseAlways<TContext> : SqliteInitializerBase<TC
1717
/// </summary>
1818
/// <param name="modelBuilder">The model builder.</param>
1919
public SqliteDropCreateDatabaseAlways(DbModelBuilder modelBuilder)
20-
: base(modelBuilder)
20+
: this(modelBuilder, null)
21+
{ }
22+
23+
/// <summary>
24+
/// Initializes a new instance of the <see cref="SqliteDropCreateDatabaseAlways{TContext}"/> class.
25+
/// </summary>
26+
/// <param name="modelBuilder">The model builder.</param>
27+
/// <param name="defaultCollation">The default collation applied to all string columns. Explicit <see cref="CollateAttribute"/>s take precedence.</param>
28+
public SqliteDropCreateDatabaseAlways(DbModelBuilder modelBuilder, Collation defaultCollation)
29+
: base(modelBuilder, defaultCollation)
2130
{ }
2231

2332
/// <summary>

SQLite.CodeFirst/Public/DbInitializers/SqliteDropCreateDatabaseWhenModelChanges.cs

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -34,19 +34,35 @@ public class SqliteDropCreateDatabaseWhenModelChanges<TContext> : SqliteInitiali
3434
/// </summary>
3535
/// <param name="modelBuilder">The model builder.</param>
3636
public SqliteDropCreateDatabaseWhenModelChanges(DbModelBuilder modelBuilder)
37-
: base(modelBuilder)
38-
{
39-
historyEntityType = typeof(History);
40-
ConfigureHistoryEntity();
41-
}
37+
: this(modelBuilder, typeof(History), null)
38+
{ }
39+
40+
/// <summary>
41+
/// Initializes a new instance of the <see cref="SqliteDropCreateDatabaseWhenModelChanges{TContext}"/> class.
42+
/// </summary>
43+
/// <param name="modelBuilder">The model builder.</param>
44+
/// <param name="defaultCollation">The default collation applied to all string columns. Explicit <see cref="CollateAttribute"/>s take precedence.</param>
45+
public SqliteDropCreateDatabaseWhenModelChanges(DbModelBuilder modelBuilder, Collation defaultCollation)
46+
: this(modelBuilder, typeof(History), defaultCollation)
47+
{ }
4248

4349
/// <summary>
4450
/// Initializes a new instance of the <see cref="SqliteDropCreateDatabaseWhenModelChanges{TContext}"/> class.
4551
/// </summary>
4652
/// <param name="modelBuilder">The model builder.</param>
4753
/// <param name="historyEntityType">Type of the history entity (must implement <see cref="IHistory"/> and provide an parameterless constructor).</param>
4854
public SqliteDropCreateDatabaseWhenModelChanges(DbModelBuilder modelBuilder, Type historyEntityType)
49-
: base(modelBuilder)
55+
: this(modelBuilder, historyEntityType, null)
56+
{ }
57+
58+
/// <summary>
59+
/// Initializes a new instance of the <see cref="SqliteDropCreateDatabaseWhenModelChanges{TContext}"/> class.
60+
/// </summary>
61+
/// <param name="modelBuilder">The model builder.</param>
62+
/// <param name="historyEntityType">Type of the history entity (must implement <see cref="IHistory"/> and provide an parameterless constructor).</param>
63+
/// <param name="defaultCollation">The default collation applied to all string columns. Explicit <see cref="CollateAttribute"/>s take precedence.</param>
64+
public SqliteDropCreateDatabaseWhenModelChanges(DbModelBuilder modelBuilder, Type historyEntityType, Collation defaultCollation)
65+
: base(modelBuilder, defaultCollation)
5066
{
5167
this.historyEntityType = historyEntityType;
5268
ConfigureHistoryEntity();

0 commit comments

Comments
 (0)