From d8d47443f03df8637d24889032a79f076e47eb24 Mon Sep 17 00:00:00 2001 From: Christopher Jolly Date: Fri, 29 Mar 2024 07:01:21 +0800 Subject: [PATCH] Add option to ignore msys tables when scaffolding (#236) * Add option to ignore msys tables when scaffolding --- src/EFCore.Jet.Data/AdoxSchema.cs | 33 ++++++++++++++++++- src/EFCore.Jet.Data/JetConnection.cs | 10 +++++- .../Internal/JetDatabaseModelFactory.cs | 16 ++++++--- 3 files changed, 53 insertions(+), 6 deletions(-) diff --git a/src/EFCore.Jet.Data/AdoxSchema.cs b/src/EFCore.Jet.Data/AdoxSchema.cs index 91d0fb59..b66392a3 100644 --- a/src/EFCore.Jet.Data/AdoxSchema.cs +++ b/src/EFCore.Jet.Data/AdoxSchema.cs @@ -13,6 +13,7 @@ public class AdoxSchema : SchemaProvider private readonly dynamic _connection; private readonly dynamic _catalog; + private bool _ignoreMsys; public AdoxSchema(JetConnection connection, bool naturalOnly, bool readOnly) : this(connection, readOnly) { @@ -22,7 +23,7 @@ public AdoxSchema(JetConnection connection, bool naturalOnly, bool readOnly) public AdoxSchema(JetConnection connection, bool readOnly) { _connection = new ComObject("ADODB.Connection"); - + _ignoreMsys = connection.IgnoreMsys; try { var connectionString = GetOleDbConnectionString(connection.ActiveConnectionString); @@ -105,6 +106,11 @@ public override DataTable GetTables() var tableName = (string)table.Name; + if (tableName.StartsWith("MSys", StringComparison.OrdinalIgnoreCase) && _ignoreMsys) + { + continue; + } + // Depending on the provider (ODBC or OLE DB) used, the Tables collection might contain VIEWs // that take parameters, which makes them procedures. // We make sure here, that we exclude any procedures from the returned table list. @@ -202,6 +208,11 @@ public override DataTable GetColumns() using var table = tables[i]; var tableName = (string)table.Name; + if (tableName.StartsWith("MSys", StringComparison.OrdinalIgnoreCase) && _ignoreMsys) + { + continue; + } + using var columns = table.Columns; var columnCount = columns.Count; @@ -282,6 +293,11 @@ public override DataTable GetIndexes() using var table = tables[i]; var tableName = (string)table.Name; + if (tableName.StartsWith("MSys", StringComparison.OrdinalIgnoreCase) && _ignoreMsys) + { + continue; + } + using var indexes = table.Indexes; var indexCount = (int)indexes.Count; @@ -337,6 +353,11 @@ public override DataTable GetIndexColumns() using var table = tables[i]; var tableName = (string)table.Name; + if (tableName.StartsWith("MSys", StringComparison.OrdinalIgnoreCase) && _ignoreMsys) + { + continue; + } + using var indexes = table.Indexes; var indexCount = (int)indexes.Count; @@ -384,6 +405,11 @@ public override DataTable GetRelations() using var table = tables[i]; var referencingTableName = (string)table.Name; + if (table.Name.StartsWith("MSys", StringComparison.OrdinalIgnoreCase) && _ignoreMsys) + { + continue; + } + using var keys = table.Keys; var keyCount = (int)keys.Count; @@ -446,6 +472,11 @@ public override DataTable GetRelationColumns() { using var table = tables[i]; + if (table.Name.StartsWith("MSys", StringComparison.OrdinalIgnoreCase) && _ignoreMsys) + { + continue; + } + using var keys = table.Keys; var keyCount = (int)keys.Count; diff --git a/src/EFCore.Jet.Data/JetConnection.cs b/src/EFCore.Jet.Data/JetConnection.cs index 15a27554..9fd714e3 100644 --- a/src/EFCore.Jet.Data/JetConnection.cs +++ b/src/EFCore.Jet.Data/JetConnection.cs @@ -28,7 +28,7 @@ public class JetConnection : DbConnection, IDisposable, ICloneable internal string? FileNameOrConnectionString => ConnectionString; public const string DefaultDualTableName = "#Dual"; - + private bool _ignoreMSys; /// /// Initializes a new instance of the class. /// @@ -81,6 +81,8 @@ public JetConnection(string? fileNameOrConnectionString, DbProviderFactory? data /// public bool IsEmpty { get; set; } + public bool IgnoreMsys => _ignoreMSys; + /// /// Gets the for this . /// @@ -358,6 +360,12 @@ public override void Open() var connectionStringBuilder = DataAccessProviderFactory.CreateConnectionStringBuilder(); connectionStringBuilder.ConnectionString = connectionString; + if (connectionStringBuilder.Remove("IgnoreMsys")) + { + _ignoreMSys = true; + connectionString = connectionStringBuilder.ToString(); + } + if (string.IsNullOrWhiteSpace(connectionStringBuilder.GetProvider())) { var provider = GetMostRecentCompatibleProviders(dataAccessProviderType.Value) diff --git a/src/EFCore.Jet/Scaffolding/Internal/JetDatabaseModelFactory.cs b/src/EFCore.Jet/Scaffolding/Internal/JetDatabaseModelFactory.cs index 0b9437dc..7a11e9f4 100644 --- a/src/EFCore.Jet/Scaffolding/Internal/JetDatabaseModelFactory.cs +++ b/src/EFCore.Jet/Scaffolding/Internal/JetDatabaseModelFactory.cs @@ -52,6 +52,9 @@ private static string ColumnKey(DatabaseTable table, string columnName) private readonly IDiagnosticsLogger _logger; private readonly IRelationalTypeMappingSource _typeMappingSource; + + private bool _ignoreMsys = false; + private List _msysNames = new List(); /// /// This API supports the Entity Framework Core infrastructure and is not intended to be used /// directly from your code. This API may change or be removed in future releases. @@ -75,7 +78,6 @@ public override DatabaseModel Create(string connectionString, DatabaseModelFacto { Check.NotEmpty(connectionString, nameof(connectionString)); Check.NotNull(options, nameof(options)); - using var connection = new JetConnection(connectionString); return Create(connection, options); } @@ -99,6 +101,7 @@ public override DatabaseModel Create(string connectionString, DatabaseModelFacto if (!connectionStartedOpen) { connection.Open(); + _ignoreMsys = ((JetConnection)connection).IgnoreMsys; } try @@ -133,11 +136,11 @@ public override DatabaseModel Create(string connectionString, DatabaseModelFacto } var tableNames = databaseModel.Tables.Select(t => t.Name).ToList(); - if (tableNames.Contains("MSysAccessStorage")) + if (tableNames.Contains("MSysAccessStorage") || _msysNames.Contains("MSysAccessStorage")) { JetConfiguration.DetectedDualTableName = "MSysAccessStorage"; } - else if (tableNames.Contains("MSysRelationships")) + else if (tableNames.Contains("MSysRelationships") || _msysNames.Contains("MSysRelationships")) { JetConfiguration.DetectedDualTableName = "MSysRelationships"; } @@ -196,8 +199,13 @@ private static string Parse(string tableName) ? new DatabaseTable() { Database = databaseModel, Name = name! } : new DatabaseView() { Database = databaseModel, Name = name! }; + var isMsys = table.Name.StartsWith("MSys", StringComparison.OrdinalIgnoreCase); + if (isMsys) + { + _msysNames.Add(table.Name); + } var isValidByFilter = filter?.Invoke(table.Schema!, table.Name) ?? true; - if (isValidByFilter) + if (isValidByFilter && !(_ignoreMsys && isMsys)) { tables.Add(table); }