Skip to content

Add option to ignore msys tables when scaffolding #236

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
Mar 28, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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(
if (!connectionStartedOpen)
{
connection.Open();
_ignoreMsys = ((JetConnection)connection).IgnoreMsys;
}

try
Expand Down Expand Up @@ -133,11 +136,11 @@ public override DatabaseModel Create(
}

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 IReadOnlyList<DatabaseTable> GetTables(
? 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