Skip to content

Commit

Permalink
Merge branch 'master' into dtoffsetfix
Browse files Browse the repository at this point in the history
  • Loading branch information
ChrisJollyAU committed Mar 30, 2024
2 parents eb45a0f + d8d4744 commit 013491f
Show file tree
Hide file tree
Showing 3 changed files with 53 additions and 6 deletions.
33 changes: 32 additions & 1 deletion src/EFCore.Jet.Data/AdoxSchema.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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)
{
Expand All @@ -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);
Expand Down Expand Up @@ -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.
Expand Down Expand Up @@ -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;

Expand Down Expand Up @@ -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;

Expand Down Expand Up @@ -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;

Expand Down Expand Up @@ -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;

Expand Down Expand Up @@ -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;

Expand Down
10 changes: 9 additions & 1 deletion src/EFCore.Jet.Data/JetConnection.cs
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ public class JetConnection : DbConnection, IDisposable, ICloneable
internal string? FileNameOrConnectionString => ConnectionString;

public const string DefaultDualTableName = "#Dual";

private bool _ignoreMSys;
/// <summary>
/// Initializes a new instance of the <see cref="JetConnection"/> class.
/// </summary>
Expand Down Expand Up @@ -81,6 +81,8 @@ public JetConnection(string? fileNameOrConnectionString, DbProviderFactory? data
/// </value>
public bool IsEmpty { get; set; }

public bool IgnoreMsys => _ignoreMSys;

/// <summary>
/// Gets the <see cref="T:System.Data.Common.DbProviderFactory" /> for this <see cref="T:System.Data.Common.DbConnection" />.
/// </summary>
Expand Down Expand Up @@ -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)
Expand Down
16 changes: 12 additions & 4 deletions src/EFCore.Jet/Scaffolding/Internal/JetDatabaseModelFactory.cs
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,9 @@ private static string ColumnKey(DatabaseTable table, string columnName)

private readonly IDiagnosticsLogger<DbLoggerCategory.Scaffolding> _logger;
private readonly IRelationalTypeMappingSource _typeMappingSource;

private bool _ignoreMsys = false;
private List<string> _msysNames = new List<string>();
/// <summary>
/// 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.
Expand All @@ -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);
}
Expand All @@ -99,6 +101,7 @@ public override DatabaseModel Create(string connectionString, DatabaseModelFacto
if (!connectionStartedOpen)
{
connection.Open();
_ignoreMsys = ((JetConnection)connection).IgnoreMsys;
}

try
Expand Down Expand Up @@ -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";
}
Expand Down Expand Up @@ -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);
}
Expand Down

0 comments on commit 013491f

Please sign in to comment.