From 12614cd7a10993fcea9a368d69bf67c8377764ee Mon Sep 17 00:00:00 2001 From: Laurents Meyer Date: Wed, 2 Jun 2021 23:57:34 +0200 Subject: [PATCH] Ensure columns of relationships (FK -> PK/AK) are applied in the original order, when scaffolding. (#104) --- src/EFCore.Jet.Data/AdoxSchema.cs | 3 +- src/EFCore.Jet.Data/DaoSchema.cs | 3 +- .../JetStoreSchemaDefinition/SchemaTables.cs | 1 + .../Internal/JetDatabaseModelFactory.cs | 2 +- .../JetInformationSchemaTest.cs | 6 ++-- .../JetDatabaseModelFactoryTest.cs | 30 +++++++++++++++++++ 6 files changed, 39 insertions(+), 6 deletions(-) diff --git a/src/EFCore.Jet.Data/AdoxSchema.cs b/src/EFCore.Jet.Data/AdoxSchema.cs index 87c0f4b..623e992 100644 --- a/src/EFCore.Jet.Data/AdoxSchema.cs +++ b/src/EFCore.Jet.Data/AdoxSchema.cs @@ -471,7 +471,8 @@ namespace EntityFrameworkCore.Jet.Data dataTable.Rows.Add( relationName, referencingColumnName, - principalColumnName); + principalColumnName, + k + 1); } } } diff --git a/src/EFCore.Jet.Data/DaoSchema.cs b/src/EFCore.Jet.Data/DaoSchema.cs index a7fb6ef..60140a4 100644 --- a/src/EFCore.Jet.Data/DaoSchema.cs +++ b/src/EFCore.Jet.Data/DaoSchema.cs @@ -470,7 +470,8 @@ namespace EntityFrameworkCore.Jet.Data dataTable.Rows.Add( relationName, referencingColumnName, - principalColumnName); + principalColumnName, + j + 1); } } diff --git a/src/EFCore.Jet.Data/JetStoreSchemaDefinition/SchemaTables.cs b/src/EFCore.Jet.Data/JetStoreSchemaDefinition/SchemaTables.cs index 7c1db84..b43a431 100644 --- a/src/EFCore.Jet.Data/JetStoreSchemaDefinition/SchemaTables.cs +++ b/src/EFCore.Jet.Data/JetStoreSchemaDefinition/SchemaTables.cs @@ -110,6 +110,7 @@ namespace EntityFrameworkCore.Jet.Data.JetStoreSchemaDefinition new DataColumn("RELATION_NAME", typeof(string)), new DataColumn("REFERENCING_COLUMN_NAME", typeof(string)), new DataColumn("PRINCIPAL_COLUMN_NAME", typeof(string)), + new DataColumn("ORDINAL_POSITION", typeof(int)), }); return dataTable; diff --git a/src/EFCore.Jet/Scaffolding/Internal/JetDatabaseModelFactory.cs b/src/EFCore.Jet/Scaffolding/Internal/JetDatabaseModelFactory.cs index ec58843..816c68b 100644 --- a/src/EFCore.Jet/Scaffolding/Internal/JetDatabaseModelFactory.cs +++ b/src/EFCore.Jet/Scaffolding/Internal/JetDatabaseModelFactory.cs @@ -443,7 +443,7 @@ namespace EntityFrameworkCore.Jet.Scaffolding.Internal var relationColumnsTable = new DataTable(); using (var command = connection.CreateCommand()) { - command.CommandText = "SELECT * FROM `INFORMATION_SCHEMA.RELATION_COLUMNS` ORDER BY RELATION_NAME, REFERENCING_COLUMN_NAME, PRINCIPAL_COLUMN_NAME"; + command.CommandText = "SELECT * FROM `INFORMATION_SCHEMA.RELATION_COLUMNS` ORDER BY RELATION_NAME, ORDINAL_POSITION"; // no sorting would be fine as well using var reader = command.ExecuteReader(); relationColumnsTable.Load(reader); } diff --git a/test/EFCore.Jet.Data.Tests/JetInformationSchemaTest.cs b/test/EFCore.Jet.Data.Tests/JetInformationSchemaTest.cs index 2ebf3c5..aafb1c2 100644 --- a/test/EFCore.Jet.Data.Tests/JetInformationSchemaTest.cs +++ b/test/EFCore.Jet.Data.Tests/JetInformationSchemaTest.cs @@ -229,9 +229,9 @@ WHERE RELATION_NAME = 'FK_Order_Details_Orders' ORDER BY RELATION_NAME, REFERENCING_COLUMN_NAME, PRINCIPAL_COLUMN_NAME"); AssertDataReaderContent(result, @" -`RELATION_NAME` | `REFERENCING_COLUMN_NAME` | `PRINCIPAL_COLUMN_NAME` ---- | --- | --- -FK_Order_Details_Orders | OrderID | OrderID"); +`RELATION_NAME` | `REFERENCING_COLUMN_NAME` | `PRINCIPAL_COLUMN_NAME` | `ORDINAL_POSITION` +--- | --- | --- | --- +FK_Order_Details_Orders | OrderID | OrderID | 1"); } [DataTestMethod] diff --git a/test/EFCore.Jet.FunctionalTests/Scaffolding/JetDatabaseModelFactoryTest.cs b/test/EFCore.Jet.FunctionalTests/Scaffolding/JetDatabaseModelFactoryTest.cs index 1e6a727..8867462 100644 --- a/test/EFCore.Jet.FunctionalTests/Scaffolding/JetDatabaseModelFactoryTest.cs +++ b/test/EFCore.Jet.FunctionalTests/Scaffolding/JetDatabaseModelFactoryTest.cs @@ -1511,6 +1511,36 @@ DROP TABLE DependentTable; DROP TABLE PrincipalTable;"); } + [ConditionalFact] + public void Relationship_column_order_is_as_defined() + { + Test( + @" +CREATE TABLE PrincipalTable ( + IdB int, + IdA int, + PRIMARY KEY (IdB, IdA) +); + +CREATE TABLE DependentTable ( + Id int PRIMARY KEY, + ForeignKeyIdB int, + ForeignKeyIdA int, + FOREIGN KEY (ForeignKeyIdB, ForeignKeyIdA) REFERENCES PrincipalTable(IdB, IdA) +);", + Enumerable.Empty(), + Enumerable.Empty(), + dbModel => + { + var fk = Assert.Single(dbModel.Tables.Single(t => t.Name == "DependentTable").ForeignKeys); + + Assert.Equal(fk.PrincipalColumns, fk.PrincipalTable.PrimaryKey.Columns); + }, + @" +DROP TABLE DependentTable; +DROP TABLE PrincipalTable;"); + } + #endregion #region Warnings