Skip to content

Commit 43b4242

Browse files
Ja bist du narrischJa bist du narrisch
authored andcommitted
Added multi column FK test for GetForeignKeys
1 parent 521a65e commit 43b4242

File tree

2 files changed

+53
-1
lines changed

2 files changed

+53
-1
lines changed

src/Migrator.Tests/Providers/Base/TransformationProviderConstraintBase.cs

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -145,10 +145,12 @@ public void AddTableWithCompoundPrimaryKeyShouldKeepNullForOtherProperties()
145145
new Column("AddressId", DbType.Int32, ColumnProperty.PrimaryKey),
146146
new Column("Name", DbType.String, 30, ColumnProperty.Null)
147147
);
148+
148149
Assert.That(Provider.TableExists("Test"), Is.True, "Table doesn't exist");
149150
Assert.That(Provider.PrimaryKeyExists("Test", "PK_Test"), Is.True, "Constraint doesn't exist");
150151

151152
var column = Provider.GetColumnByName("Test", "Name");
153+
152154
Assert.That(column, Is.Not.Null);
153155
Assert.That((column.ColumnProperty & ColumnProperty.Null) == ColumnProperty.Null, Is.True);
154156
}
@@ -174,8 +176,10 @@ public void GetForeignKeyConstraints_SingleColumn_Success()
174176

175177
Provider.AddForeignKey(fkName, childTableName, parentIdColumn, parentTableName, idColumn);
176178

179+
// Act
177180
var foreignKeyConstraints = Provider.GetForeignKeyConstraints(childTableName);
178181

182+
// Assert
179183
var resultSingle = foreignKeyConstraints.Single();
180184

181185
Assert.That(resultSingle.Name.ToLowerInvariant(), Is.EqualTo(fkName.ToLowerInvariant()));
@@ -184,4 +188,50 @@ public void GetForeignKeyConstraints_SingleColumn_Success()
184188
Assert.That(resultSingle.ChildColumns.Select(x => x.ToLowerInvariant()).Single(), Is.EqualTo(parentIdColumn.ToLowerInvariant()));
185189
Assert.That(resultSingle.ParentColumns.Select(x => x.ToLowerInvariant()).Single(), Is.EqualTo(idColumn.ToLowerInvariant()));
186190
}
191+
192+
[Test]
193+
public void GetForeignKeyConstraints_MultiColumnColumn_Success()
194+
{
195+
// Arrange
196+
const string fkName = "MyForeignKey";
197+
const string childTableName = "ChildTable";
198+
const string parentTableName = "ParentTable";
199+
200+
const string parentColumnId = "Id";
201+
const string parentColumnTest = "Test";
202+
const string childColumnParentId = "ParentId";
203+
const string childColumnParentTest = "ParentTest";
204+
205+
Provider.AddTable(parentTableName,
206+
new Column(parentColumnId, DbType.Int32, ColumnProperty.PrimaryKey),
207+
new Column(parentColumnTest, DbType.Int32, ColumnProperty.NotNull)
208+
);
209+
210+
Provider.AddTable(childTableName,
211+
new Column(childColumnParentId, DbType.Int32, ColumnProperty.PrimaryKey),
212+
new Column(childColumnParentTest, DbType.Int32)
213+
);
214+
215+
Provider.AddUniqueConstraint("MyUniqueConstraint", parentTableName, [parentColumnId, parentColumnTest]);
216+
217+
Provider.AddForeignKey(fkName, childTableName, [childColumnParentId, childColumnParentTest], parentTableName, [parentColumnId, parentColumnTest]);
218+
219+
// Act
220+
var foreignKeyConstraints = Provider.GetForeignKeyConstraints(childTableName);
221+
222+
// Assert
223+
var resultSingle = foreignKeyConstraints.Single();
224+
225+
Assert.That(resultSingle.Name.ToLowerInvariant(), Is.EqualTo(fkName.ToLowerInvariant()));
226+
Assert.That(resultSingle.ChildTable.ToLowerInvariant(), Is.EqualTo(childTableName.ToLowerInvariant()));
227+
Assert.That(resultSingle.ParentTable.ToLowerInvariant(), Is.EqualTo(parentTableName.ToLowerInvariant()));
228+
229+
var childColumns = resultSingle.ChildColumns.Select(x => x.ToLowerInvariant()).ToList();
230+
var parentColumns = resultSingle.ParentColumns.Select(x => x.ToLowerInvariant()).ToList();
231+
232+
Assert.That(childColumns[0], Is.EqualTo(childColumnParentId.ToLowerInvariant()));
233+
Assert.That(childColumns[1], Is.EqualTo(childColumnParentTest.ToLowerInvariant()));
234+
Assert.That(parentColumns[0], Is.EqualTo(parentColumnId.ToLowerInvariant()));
235+
Assert.That(parentColumns[1], Is.EqualTo(parentColumnTest.ToLowerInvariant()));
236+
}
187237
}

src/Migrator/Providers/TransformationProvider.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -156,8 +156,10 @@ public virtual ForeignKeyConstraint[] GetForeignKeyConstraints(string table)
156156
sb.AppendLine(" INFORMATION_SCHEMA.TABLE_CONSTRAINTS tc ");
157157
sb.AppendLine("JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE as kcu");
158158
sb.AppendLine(" ON tc.CONSTRAINT_NAME = kcu.CONSTRAINT_NAME AND tc.TABLE_SCHEMA = kcu.TABLE_SCHEMA");
159+
sb.AppendLine("JOIN INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS as rc");
160+
sb.AppendLine(" ON tc.CONSTRAINT_NAME = rc.CONSTRAINT_NAME AND tc.TABLE_SCHEMA = rc.CONSTRAINT_SCHEMA");
159161
sb.AppendLine("JOIN INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE AS ccu");
160-
sb.AppendLine(" ON tc.CONSTRAINT_NAME = ccu.CONSTRAINT_NAME AND tc.TABLE_SCHEMA = ccu.TABLE_SCHEMA");
162+
sb.AppendLine(" ON rc.UNIQUE_CONSTRAINT_NAME = ccu.CONSTRAINT_NAME AND rc.UNIQUE_CONSTRAINT_SCHEMA = ccu.CONSTRAINT_SCHEMA");
161163
sb.AppendLine($"WHERE LOWER(tc.TABLE_NAME) = LOWER('{table}') AND tc.CONSTRAINT_TYPE = 'FOREIGN KEY'");
162164
sb.AppendLine("ORDER BY kcu.ORDINAL_POSITION");
163165

0 commit comments

Comments
 (0)