diff --git a/src/EFCore.Jet.Data/AdoxSchema.cs b/src/EFCore.Jet.Data/AdoxSchema.cs
index 91d0fb5..b66392a 100644
--- a/src/EFCore.Jet.Data/AdoxSchema.cs
+++ b/src/EFCore.Jet.Data/AdoxSchema.cs
@@ -13,6 +13,7 @@ namespace EntityFrameworkCore.Jet.Data
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 @@ namespace EntityFrameworkCore.Jet.Data
public AdoxSchema(JetConnection connection, bool readOnly)
{
_connection = new ComObject("ADODB.Connection");
-
+ _ignoreMsys = connection.IgnoreMsys;
try
{
var connectionString = GetOleDbConnectionString(connection.ActiveConnectionString);
@@ -105,6 +106,11 @@ namespace EntityFrameworkCore.Jet.Data
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 @@ namespace EntityFrameworkCore.Jet.Data
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 @@ namespace EntityFrameworkCore.Jet.Data
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 @@ namespace EntityFrameworkCore.Jet.Data
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 @@ namespace EntityFrameworkCore.Jet.Data
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 @@ namespace EntityFrameworkCore.Jet.Data
{
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 15a2755..9fd714e 100644
--- a/src/EFCore.Jet.Data/JetConnection.cs
+++ b/src/EFCore.Jet.Data/JetConnection.cs
@@ -28,7 +28,7 @@ namespace EntityFrameworkCore.Jet.Data
internal string? FileNameOrConnectionString => ConnectionString;
public const string DefaultDualTableName = "#Dual";
-
+ private bool _ignoreMSys;
///
/// Initializes a new instance of the class.
///
@@ -81,6 +81,8 @@ namespace EntityFrameworkCore.Jet.Data
///
public bool IsEmpty { get; set; }
+ public bool IgnoreMsys => _ignoreMSys;
+
///
/// Gets the for this .
///
@@ -358,6 +360,12 @@ namespace EntityFrameworkCore.Jet.Data
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 0b9437d..7a11e9f 100644
--- a/src/EFCore.Jet/Scaffolding/Internal/JetDatabaseModelFactory.cs
+++ b/src/EFCore.Jet/Scaffolding/Internal/JetDatabaseModelFactory.cs
@@ -52,6 +52,9 @@ namespace EntityFrameworkCore.Jet.Scaffolding.Internal
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 @@ namespace EntityFrameworkCore.Jet.Scaffolding.Internal
{
Check.NotEmpty(connectionString, nameof(connectionString));
Check.NotNull(options, nameof(options));
-
using var connection = new JetConnection(connectionString);
return Create(connection, options);
}
@@ -99,6 +101,7 @@ namespace EntityFrameworkCore.Jet.Scaffolding.Internal
if (!connectionStartedOpen)
{
connection.Open();
+ _ignoreMsys = ((JetConnection)connection).IgnoreMsys;
}
try
@@ -133,11 +136,11 @@ namespace EntityFrameworkCore.Jet.Scaffolding.Internal
}
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 @@ namespace EntityFrameworkCore.Jet.Scaffolding.Internal
? 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);
}