Add option to ignore msys tables when scaffolding (#236)

* Add option to ignore msys tables when scaffolding
pull/237/head
Christopher Jolly 2 years ago committed by GitHub
parent 183a5b9a25
commit d8d47443f0
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

@ -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;

@ -28,7 +28,7 @@ namespace EntityFrameworkCore.Jet.Data
internal string? FileNameOrConnectionString => ConnectionString;
public const string DefaultDualTableName = "#Dual";
private bool _ignoreMSys;
/// <summary>
/// Initializes a new instance of the <see cref="JetConnection"/> class.
/// </summary>
@ -81,6 +81,8 @@ namespace EntityFrameworkCore.Jet.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>
@ -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)

@ -52,6 +52,9 @@ namespace EntityFrameworkCore.Jet.Scaffolding.Internal
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.
@ -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);
}

Loading…
Cancel
Save