Skip to content

Commit a7a01a1

Browse files
Merge pull request #153 from dotnetprojects/add-primary-key
Remove ColumnProperty.Null if primary key is set.
2 parents bbe2e97 + 635536e commit a7a01a1

7 files changed

+75
-20
lines changed

src/Migrator.Tests/Providers/SQLServer/SQLServerTransformationProvider_GetColumns_DefaultValues_Tests.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ public void GetColumns_DefaultValues_Succeeds()
3333
const string decimalColumnName1 = "decimalcolumn";
3434
const string guidColumnName1 = "guidcolumn1";
3535
const string booleanColumnName1 = "booleancolumn1";
36+
const string booleanColumnName2 = "booleancolumn2";
3637
const string int32ColumnName1 = "int32column1";
3738
const string int64ColumnName1 = "int64column1";
3839
const string int64ColumnName2 = "int64column2";
@@ -50,6 +51,7 @@ public void GetColumns_DefaultValues_Succeeds()
5051

5152
// other boolean default values are tested in another test
5253
new Column(booleanColumnName1, DbType.Boolean, true),
54+
new Column(booleanColumnName2, DbType.Boolean, false),
5355

5456
new Column(int32ColumnName1, DbType.Int32, defaultValue: 43),
5557
new Column(int64ColumnName1, DbType.Int64, defaultValue: 88),
@@ -69,6 +71,7 @@ public void GetColumns_DefaultValues_Succeeds()
6971
var decimalColumn1 = columns.Single(x => x.Name.Equals(decimalColumnName1, StringComparison.OrdinalIgnoreCase));
7072
var guidColumn1 = columns.Single(x => x.Name.Equals(guidColumnName1, StringComparison.OrdinalIgnoreCase));
7173
var booleanColumn1 = columns.Single(x => x.Name.Equals(booleanColumnName1, StringComparison.OrdinalIgnoreCase));
74+
var booleanColumn2 = columns.Single(x => x.Name.Equals(booleanColumnName2, StringComparison.OrdinalIgnoreCase));
7275
var int32Column1 = columns.Single(x => x.Name.Equals(int32ColumnName1, StringComparison.OrdinalIgnoreCase));
7376
var int64Column1 = columns.Single(x => x.Name.Equals(int64ColumnName1, StringComparison.OrdinalIgnoreCase));
7477
var int64Column2 = columns.Single(x => x.Name.Equals(int64ColumnName2, StringComparison.OrdinalIgnoreCase));
@@ -82,6 +85,7 @@ public void GetColumns_DefaultValues_Succeeds()
8285
Assert.That(decimalColumn1.DefaultValue, Is.EqualTo(decimalDefaultValue));
8386
Assert.That(guidColumn1.DefaultValue, Is.EqualTo(guidDefaultValue));
8487
Assert.That(booleanColumn1.DefaultValue, Is.True);
88+
Assert.That(booleanColumn2.DefaultValue, Is.False);
8589
Assert.That(int32Column1.DefaultValue, Is.EqualTo(43));
8690
Assert.That(int64Column1.DefaultValue, Is.EqualTo(88));
8791
Assert.That(stringColumn1.DefaultValue, Is.EqualTo("Hello"));

src/Migrator.Tests/Providers/SQLite/SQLiteTransformationProvider_AddColumnTests.cs

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,4 +58,57 @@ public void AddColumn_HavingColumnPropertyUniqueAndIndex_RebuildSucceeds()
5858
Assert.That(indexAfter.Name, Is.EqualTo(indexName));
5959
CollectionAssert.AreEquivalent(indexAfter.KeyColumns, new string[] { propertyName1, propertyName2 });
6060
}
61+
62+
[Test]
63+
public void AddColumn_HavingNullInPrimaryKey_HasNULLAfterAddAnotherColumn()
64+
{
65+
// Arrange/Act
66+
Provider.ExecuteNonQuery("CREATE TABLE Common_Language (LanguageID TEXT PRIMARY KEY)");
67+
68+
Provider.AddColumn("Common_Language", "Enabled", DbType.Boolean);
69+
70+
var tableInfo = ((SQLiteTransformationProvider)Provider).GetSQLiteTableInfo("Common_Language");
71+
var script = ((SQLiteTransformationProvider)Provider).GetSqlCreateTableScript("Common_Language");
72+
73+
var columnProperty = tableInfo.Columns.Single(x => x.Name == "LanguageID").ColumnProperty;
74+
75+
// Assert
76+
Assert.That(script, Does.Contain("LanguageID TEXT NULL PRIMARY KEY"));
77+
}
78+
79+
[Test]
80+
public void AddColumn_HavingNullInPrimaryKey_HasNOTNULLAfterAddAnotherColumn()
81+
{
82+
// Arrange/Act
83+
Provider.ExecuteNonQuery("CREATE TABLE Common_Language (LanguageID TEXT NOT NULL PRIMARY KEY)");
84+
85+
Provider.AddColumn("Common_Language", "Enabled", DbType.Boolean);
86+
87+
var tableInfo = ((SQLiteTransformationProvider)Provider).GetSQLiteTableInfo("Common_Language");
88+
var script = ((SQLiteTransformationProvider)Provider).GetSqlCreateTableScript("Common_Language");
89+
90+
var columnProperty = tableInfo.Columns.Single(x => x.Name == "LanguageID").ColumnProperty;
91+
92+
// Assert
93+
Assert.That(script, Does.Contain("LanguageID TEXT NOT NULL PRIMARY KEY"));
94+
}
95+
96+
[Test]
97+
public void AddColumn_HavingNotNullInPrimaryKey_Succeds()
98+
{
99+
// Arrange/Act
100+
Provider.ExecuteNonQuery("CREATE TABLE Common_Language (LanguageID INT NOT NULL PRIMARY KEY)");
101+
102+
Provider.AddColumn("Common_Language", "Enabled", DbType.Boolean);
103+
104+
var tableInfo = ((SQLiteTransformationProvider)Provider).GetSQLiteTableInfo("Common_Language");
105+
var script = ((SQLiteTransformationProvider)Provider).GetSqlCreateTableScript("Common_Language");
106+
107+
var columnProperty = tableInfo.Columns.Single(x => x.Name == "LanguageID").ColumnProperty;
108+
var hasNull = columnProperty.IsSet(ColumnProperty.Null);
109+
110+
// Assert
111+
Assert.That(script, Does.Contain("LanguageID INTEGER NOT NULL PRIMARY KEY"));
112+
Assert.That(hasNull, Is.False);
113+
}
61114
}

src/Migrator.Tests/Providers/SQLite/SQLiteTransformationProvider_AddTableTests.cs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -87,10 +87,9 @@ public void AddTable_SinglePrimaryKey_ContainsNull()
8787

8888
// Assert
8989
var createScript = ((SQLiteTransformationProvider)Provider).GetSqlCreateTableScript(tableName);
90-
Assert.That(createScript, Is.EqualTo("CREATE TABLE MyTableName (Column1 INTEGER NOT NULL PRIMARY KEY, Column2 INTEGER NOT NULL)"));
9190

92-
var pragmaTableInfos = ((SQLiteTransformationProvider)Provider).GetPragmaTableInfoItems(tableName);
93-
Assert.That(pragmaTableInfos.All(x => x.NotNull), Is.True);
91+
// In SQLite an INTEGER PRIMARY KEY column is NOT NULL implicitly (see insert asserts above)
92+
Assert.That(createScript, Is.EqualTo("CREATE TABLE MyTableName (Column1 INTEGER PRIMARY KEY, Column2 INTEGER NOT NULL)"));
9493

9594
var sqliteInfo = ((SQLiteTransformationProvider)Provider).GetSQLiteTableInfo(tableName);
9695
Assert.That(sqliteInfo.Columns.First().Name, Is.EqualTo(columnName1));

src/Migrator.Tests/Providers/SQLite/SQLiteTransformationProvider_GetColumnsTests.cs

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -63,8 +63,7 @@ public void GetColumns_Primary_ColumnPropertyOk()
6363

6464
// Assert
6565
Assert.That(columns.Single().ColumnProperty, Is.EqualTo(ColumnProperty.NotNull |
66-
ColumnProperty.Identity |
67-
ColumnProperty.PrimaryKey));
66+
ColumnProperty.PrimaryKeyWithIdentity));
6867
}
6968

7069
[Test]
@@ -82,8 +81,8 @@ public void GetColumns_PrimaryKeyOnTwoColumns_BothColumnsHavePrimaryKeyAndAreNot
8281
var columns = Provider.GetColumns(tableName);
8382

8483
// Assert
85-
Assert.That(columns[0].ColumnProperty, Is.EqualTo(ColumnProperty.PrimaryKey | ColumnProperty.Null));
86-
Assert.That(columns[1].ColumnProperty, Is.EqualTo(ColumnProperty.PrimaryKey | ColumnProperty.Null));
84+
Assert.That(columns[0].ColumnProperty, Is.EqualTo(ColumnProperty.PrimaryKey | ColumnProperty.NotNull));
85+
Assert.That(columns[1].ColumnProperty, Is.EqualTo(ColumnProperty.PrimaryKey | ColumnProperty.NotNull));
8786
}
8887

8988
[Test]

src/Migrator.Tests/Providers/SQLite/SQLiteTransformationProvider_PropertyColumnIdentityTests.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ public void AddPrimaryIdentity_Succeeds()
2525

2626
var sql = ((SQLiteTransformationProvider)Provider).GetSqlCreateTableScript(testTableName);
2727

28-
Assert.That(sql, Does.Contain("Color1 INTEGER NOT NULL PRIMARY KEY"));
28+
// NOT NULL implicitly set in SQLite
29+
Assert.That(sql, Does.Contain("Color1 INTEGER PRIMARY KEY"));
2930
}
3031
}

src/Migrator/Providers/Impl/SQLite/SQLiteColumnPropertiesMapper.cs

Lines changed: 1 addition & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
using System;
21
using System.Collections.Generic;
32
using DotNetProjects.Migrator.Framework;
43

@@ -24,16 +23,7 @@ protected override void AddNull(Column column, List<string> vals)
2423

2524
protected override void AddNotNull(Column column, List<string> vals)
2625
{
27-
var isPrimaryKeySelected = PropertySelected(column.ColumnProperty, ColumnProperty.PrimaryKey);
28-
var isNullSelected = PropertySelected(column.ColumnProperty, ColumnProperty.Null);
29-
var isNotNullSelected = PropertySelected(column.ColumnProperty, ColumnProperty.NotNull);
30-
31-
if (isNullSelected && isPrimaryKeySelected)
32-
{
33-
throw new Exception("This is currently not supported by the migrator see issue #44. You need to use NOT NULL for a PK column.");
34-
}
35-
36-
if (isNotNullSelected || isPrimaryKeySelected)
26+
if (column.ColumnProperty.HasFlag(ColumnProperty.NotNull))
3727
{
3828
AddValueIfSelected(column, ColumnProperty.NotNull, vals);
3929
}

src/Migrator/Providers/Impl/SQLite/SQLiteTransformationProvider.cs

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1212,7 +1212,16 @@ public override Column[] GetColumns(string tableName)
12121212

12131213
if (pragmaTableInfoItem.Pk > 0)
12141214
{
1215-
column.ColumnProperty |= ColumnProperty.PrimaryKey;
1215+
if (new[] { DbType.UInt16, DbType.UInt32, DbType.UInt64, DbType.Int16, DbType.Int32, DbType.Int64 }.Contains(column.Type))
1216+
{
1217+
column.ColumnProperty |= ColumnProperty.PrimaryKey;
1218+
column.ColumnProperty |= ColumnProperty.NotNull;
1219+
column.ColumnProperty = column.ColumnProperty.Clear(ColumnProperty.Null);
1220+
}
1221+
else
1222+
{
1223+
column.ColumnProperty |= ColumnProperty.PrimaryKey;
1224+
}
12161225
}
12171226

12181227
var indexListItems = GetPragmaIndexListItems(tableName);

0 commit comments

Comments
 (0)