From 45dcfbe0ddf2f00870b0a030450b3f5e5ab491a8 Mon Sep 17 00:00:00 2001 From: Laurents Meyer Date: Thu, 10 Dec 2020 01:14:32 +0100 Subject: [PATCH] When creating databases, automatically use the latest database version that is supported by the current file extension. (#90) --- src/EFCore.Jet.Data/AdoxDatabaseCreator.cs | 11 ++++++++--- src/EFCore.Jet.Data/DaoDatabaseCreator.cs | 9 +++++++-- src/EFCore.Jet.Data/IJetDatabaseCreator.cs | 5 +++-- src/EFCore.Jet.Data/JetConnection.cs | 4 ++-- src/EFCore.Jet.Data/JetDatabaseCreator.cs | 2 +- src/EFCore.Jet.Data/PreciseDatabaseCreator.cs | 2 +- test/EFCore.Jet.Data.Tests/Helpers.cs | 2 +- 7 files changed, 23 insertions(+), 12 deletions(-) diff --git a/src/EFCore.Jet.Data/AdoxDatabaseCreator.cs b/src/EFCore.Jet.Data/AdoxDatabaseCreator.cs index b23d09a..4eb570e 100644 --- a/src/EFCore.Jet.Data/AdoxDatabaseCreator.cs +++ b/src/EFCore.Jet.Data/AdoxDatabaseCreator.cs @@ -8,7 +8,7 @@ namespace EntityFrameworkCore.Jet.Data { public override void CreateDatabase( string fileNameOrConnectionString, - DatabaseVersion version = DatabaseVersion.Newest, + DatabaseVersion version = DatabaseVersion.NewestSupported, CollatingOrder collatingOrder = CollatingOrder.General, string databasePassword = null) { @@ -20,10 +20,16 @@ namespace EntityFrameworkCore.Jet.Data var filePath = JetStoreDatabaseHandling.ExpandFileName(JetStoreDatabaseHandling.ExtractFileNameFromConnectionString(fileNameOrConnectionString)); + if (version == DatabaseVersion.NewestSupported && + string.Equals(System.IO.Path.GetExtension(filePath), ".mdb")) + { + version = DatabaseVersion.Version40; + } + try { using dynamic catalog = new ComObject("ADOX.Catalog"); - + // ADOX is an ADO eXtension and ADO is build on top of OLE DB. var connectionString = GetConnectionString(filePath, version, collatingOrder, databasePassword); using var connection = catalog.Create(connectionString); @@ -86,7 +92,6 @@ namespace EntityFrameworkCore.Jet.Data DatabaseVersion.Version30 => 5, DatabaseVersion.Version40 => 5, DatabaseVersion.Version120 => 6, - DatabaseVersion.Newest => 0, _ => 0 }; diff --git a/src/EFCore.Jet.Data/DaoDatabaseCreator.cs b/src/EFCore.Jet.Data/DaoDatabaseCreator.cs index 1766b35..b3a7cb1 100644 --- a/src/EFCore.Jet.Data/DaoDatabaseCreator.cs +++ b/src/EFCore.Jet.Data/DaoDatabaseCreator.cs @@ -9,7 +9,7 @@ namespace EntityFrameworkCore.Jet.Data { public override void CreateDatabase( string fileNameOrConnectionString, - DatabaseVersion version = DatabaseVersion.Newest, + DatabaseVersion version = DatabaseVersion.NewestSupported, CollatingOrder collatingOrder = CollatingOrder.General, string databasePassword = null) { @@ -20,6 +20,12 @@ namespace EntityFrameworkCore.Jet.Data } var filePath = JetStoreDatabaseHandling.ExpandFileName(JetStoreDatabaseHandling.ExtractFileNameFromConnectionString(fileNameOrConnectionString)); + + if (version == DatabaseVersion.NewestSupported && + string.Equals(System.IO.Path.GetExtension(filePath), ".mdb")) + { + version = DatabaseVersion.Version40; + } try { @@ -33,7 +39,6 @@ namespace EntityFrameworkCore.Jet.Data DatabaseVersion.Version30 => (int) DatabaseTypeEnum.dbVersion30, DatabaseVersion.Version40 => (int) DatabaseTypeEnum.dbVersion40, DatabaseVersion.Version120 => (int) DatabaseTypeEnum.dbVersion120, - DatabaseVersion.Newest => 0, _ => 0, }; diff --git a/src/EFCore.Jet.Data/IJetDatabaseCreator.cs b/src/EFCore.Jet.Data/IJetDatabaseCreator.cs index 5cc309c..b47cab4 100644 --- a/src/EFCore.Jet.Data/IJetDatabaseCreator.cs +++ b/src/EFCore.Jet.Data/IJetDatabaseCreator.cs @@ -31,7 +31,8 @@ namespace EntityFrameworkCore.Jet.Data public enum DatabaseVersion { - Newest = 0, + Newest = -1, + NewestSupported = 0, Version10 = 10, Version11 = 11, Version20 = 20, @@ -44,7 +45,7 @@ namespace EntityFrameworkCore.Jet.Data { void CreateDatabase( string fileNameOrConnectionString, - DatabaseVersion version = DatabaseVersion.Newest, + DatabaseVersion version = DatabaseVersion.NewestSupported, CollatingOrder collatingOrder = CollatingOrder.General, string databasePassword = null); diff --git a/src/EFCore.Jet.Data/JetConnection.cs b/src/EFCore.Jet.Data/JetConnection.cs index e83ac5f..643aafd 100644 --- a/src/EFCore.Jet.Data/JetConnection.cs +++ b/src/EFCore.Jet.Data/JetConnection.cs @@ -506,14 +506,14 @@ namespace EntityFrameworkCore.Jet.Data => InnerConnectionFactory.Instance.ClearAllPools(); public void CreateDatabase( - DatabaseVersion version = DatabaseVersion.Newest, + DatabaseVersion version = DatabaseVersion.NewestSupported, CollatingOrder collatingOrder = CollatingOrder.General, string databasePassword = null) => CreateDatabase(DataSource, version, collatingOrder, databasePassword, SchemaProviderType); public static void CreateDatabase( string fileNameOrConnectionString, - DatabaseVersion version = DatabaseVersion.Newest, + DatabaseVersion version = DatabaseVersion.NewestSupported, CollatingOrder collatingOrder = CollatingOrder.General, string databasePassword = null, SchemaProviderType schemaProviderType = SchemaProviderType.Precise) diff --git a/src/EFCore.Jet.Data/JetDatabaseCreator.cs b/src/EFCore.Jet.Data/JetDatabaseCreator.cs index 3b41767..6d9a319 100644 --- a/src/EFCore.Jet.Data/JetDatabaseCreator.cs +++ b/src/EFCore.Jet.Data/JetDatabaseCreator.cs @@ -13,7 +13,7 @@ namespace EntityFrameworkCore.Jet.Data _ => throw new ArgumentOutOfRangeException(nameof(schemaProviderType)) }; - public abstract void CreateDatabase(string fileNameOrConnectionString, DatabaseVersion version = DatabaseVersion.Newest, CollatingOrder collatingOrder = CollatingOrder.General, string databasePassword = null); + public abstract void CreateDatabase(string fileNameOrConnectionString, DatabaseVersion version = DatabaseVersion.NewestSupported, CollatingOrder collatingOrder = CollatingOrder.General, string databasePassword = null); public abstract void CreateDualTable(string fileNameOrConnectionString, string databasePassword = null); } } \ No newline at end of file diff --git a/src/EFCore.Jet.Data/PreciseDatabaseCreator.cs b/src/EFCore.Jet.Data/PreciseDatabaseCreator.cs index 375736e..dd887d0 100644 --- a/src/EFCore.Jet.Data/PreciseDatabaseCreator.cs +++ b/src/EFCore.Jet.Data/PreciseDatabaseCreator.cs @@ -5,7 +5,7 @@ namespace EntityFrameworkCore.Jet.Data { public override void CreateDatabase( string fileNameOrConnectionString, - DatabaseVersion version = DatabaseVersion.Newest, + DatabaseVersion version = DatabaseVersion.NewestSupported, CollatingOrder collatingOrder = CollatingOrder.General, string databasePassword = null) => new DaoDatabaseCreator().CreateDatabase(fileNameOrConnectionString, version, collatingOrder, databasePassword); diff --git a/test/EFCore.Jet.Data.Tests/Helpers.cs b/test/EFCore.Jet.Data.Tests/Helpers.cs index fad22b0..0df3890 100644 --- a/test/EFCore.Jet.Data.Tests/Helpers.cs +++ b/test/EFCore.Jet.Data.Tests/Helpers.cs @@ -261,7 +261,7 @@ namespace EntityFrameworkCore.Jet.Data.Tests public static void CreateDatabase( string storeName, - DatabaseVersion version = DatabaseVersion.Newest, + DatabaseVersion version = DatabaseVersion.NewestSupported, CollatingOrder collatingOrder = CollatingOrder.General, string databasePassword = null) {