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 _connection;
private readonly dynamic _catalog; private readonly dynamic _catalog;
private bool _ignoreMsys;
public AdoxSchema(JetConnection connection, bool naturalOnly, bool readOnly) public AdoxSchema(JetConnection connection, bool naturalOnly, bool readOnly)
: this(connection, readOnly) : this(connection, readOnly)
{ {
@ -22,7 +23,7 @@ namespace EntityFrameworkCore.Jet.Data
public AdoxSchema(JetConnection connection, bool readOnly) public AdoxSchema(JetConnection connection, bool readOnly)
{ {
_connection = new ComObject("ADODB.Connection"); _connection = new ComObject("ADODB.Connection");
_ignoreMsys = connection.IgnoreMsys;
try try
{ {
var connectionString = GetOleDbConnectionString(connection.ActiveConnectionString); var connectionString = GetOleDbConnectionString(connection.ActiveConnectionString);
@ -105,6 +106,11 @@ namespace EntityFrameworkCore.Jet.Data
var tableName = (string)table.Name; 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 // Depending on the provider (ODBC or OLE DB) used, the Tables collection might contain VIEWs
// that take parameters, which makes them procedures. // that take parameters, which makes them procedures.
// We make sure here, that we exclude any procedures from the returned table list. // 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]; using var table = tables[i];
var tableName = (string)table.Name; var tableName = (string)table.Name;
if (tableName.StartsWith("MSys", StringComparison.OrdinalIgnoreCase) && _ignoreMsys)
{
continue;
}
using var columns = table.Columns; using var columns = table.Columns;
var columnCount = columns.Count; var columnCount = columns.Count;
@ -282,6 +293,11 @@ namespace EntityFrameworkCore.Jet.Data
using var table = tables[i]; using var table = tables[i];
var tableName = (string)table.Name; var tableName = (string)table.Name;
if (tableName.StartsWith("MSys", StringComparison.OrdinalIgnoreCase) && _ignoreMsys)
{
continue;
}
using var indexes = table.Indexes; using var indexes = table.Indexes;
var indexCount = (int)indexes.Count; var indexCount = (int)indexes.Count;
@ -337,6 +353,11 @@ namespace EntityFrameworkCore.Jet.Data
using var table = tables[i]; using var table = tables[i];
var tableName = (string)table.Name; var tableName = (string)table.Name;
if (tableName.StartsWith("MSys", StringComparison.OrdinalIgnoreCase) && _ignoreMsys)
{
continue;
}
using var indexes = table.Indexes; using var indexes = table.Indexes;
var indexCount = (int)indexes.Count; var indexCount = (int)indexes.Count;
@ -384,6 +405,11 @@ namespace EntityFrameworkCore.Jet.Data
using var table = tables[i]; using var table = tables[i];
var referencingTableName = (string)table.Name; var referencingTableName = (string)table.Name;
if (table.Name.StartsWith("MSys", StringComparison.OrdinalIgnoreCase) && _ignoreMsys)
{
continue;
}
using var keys = table.Keys; using var keys = table.Keys;
var keyCount = (int)keys.Count; var keyCount = (int)keys.Count;
@ -446,6 +472,11 @@ namespace EntityFrameworkCore.Jet.Data
{ {
using var table = tables[i]; using var table = tables[i];
if (table.Name.StartsWith("MSys", StringComparison.OrdinalIgnoreCase) && _ignoreMsys)
{
continue;
}
using var keys = table.Keys; using var keys = table.Keys;
var keyCount = (int)keys.Count; var keyCount = (int)keys.Count;

@ -28,7 +28,7 @@ namespace EntityFrameworkCore.Jet.Data
internal string? FileNameOrConnectionString => ConnectionString; internal string? FileNameOrConnectionString => ConnectionString;
public const string DefaultDualTableName = "#Dual"; public const string DefaultDualTableName = "#Dual";
private bool _ignoreMSys;
/// <summary> /// <summary>
/// Initializes a new instance of the <see cref="JetConnection"/> class. /// Initializes a new instance of the <see cref="JetConnection"/> class.
/// </summary> /// </summary>
@ -81,6 +81,8 @@ namespace EntityFrameworkCore.Jet.Data
/// </value> /// </value>
public bool IsEmpty { get; set; } public bool IsEmpty { get; set; }
public bool IgnoreMsys => _ignoreMSys;
/// <summary> /// <summary>
/// Gets the <see cref="T:System.Data.Common.DbProviderFactory" /> for this <see cref="T:System.Data.Common.DbConnection" />. /// Gets the <see cref="T:System.Data.Common.DbProviderFactory" /> for this <see cref="T:System.Data.Common.DbConnection" />.
/// </summary> /// </summary>
@ -358,6 +360,12 @@ namespace EntityFrameworkCore.Jet.Data
var connectionStringBuilder = DataAccessProviderFactory.CreateConnectionStringBuilder(); var connectionStringBuilder = DataAccessProviderFactory.CreateConnectionStringBuilder();
connectionStringBuilder.ConnectionString = connectionString; connectionStringBuilder.ConnectionString = connectionString;
if (connectionStringBuilder.Remove("IgnoreMsys"))
{
_ignoreMSys = true;
connectionString = connectionStringBuilder.ToString();
}
if (string.IsNullOrWhiteSpace(connectionStringBuilder.GetProvider())) if (string.IsNullOrWhiteSpace(connectionStringBuilder.GetProvider()))
{ {
var provider = GetMostRecentCompatibleProviders(dataAccessProviderType.Value) var provider = GetMostRecentCompatibleProviders(dataAccessProviderType.Value)

@ -52,6 +52,9 @@ namespace EntityFrameworkCore.Jet.Scaffolding.Internal
private readonly IDiagnosticsLogger<DbLoggerCategory.Scaffolding> _logger; private readonly IDiagnosticsLogger<DbLoggerCategory.Scaffolding> _logger;
private readonly IRelationalTypeMappingSource _typeMappingSource; private readonly IRelationalTypeMappingSource _typeMappingSource;
private bool _ignoreMsys = false;
private List<string> _msysNames = new List<string>();
/// <summary> /// <summary>
/// This API supports the Entity Framework Core infrastructure and is not intended to be used /// 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. /// 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.NotEmpty(connectionString, nameof(connectionString));
Check.NotNull(options, nameof(options)); Check.NotNull(options, nameof(options));
using var connection = new JetConnection(connectionString); using var connection = new JetConnection(connectionString);
return Create(connection, options); return Create(connection, options);
} }
@ -99,6 +101,7 @@ namespace EntityFrameworkCore.Jet.Scaffolding.Internal
if (!connectionStartedOpen) if (!connectionStartedOpen)
{ {
connection.Open(); connection.Open();
_ignoreMsys = ((JetConnection)connection).IgnoreMsys;
} }
try try
@ -133,11 +136,11 @@ namespace EntityFrameworkCore.Jet.Scaffolding.Internal
} }
var tableNames = databaseModel.Tables.Select(t => t.Name).ToList(); var tableNames = databaseModel.Tables.Select(t => t.Name).ToList();
if (tableNames.Contains("MSysAccessStorage")) if (tableNames.Contains("MSysAccessStorage") || _msysNames.Contains("MSysAccessStorage"))
{ {
JetConfiguration.DetectedDualTableName = "MSysAccessStorage"; JetConfiguration.DetectedDualTableName = "MSysAccessStorage";
} }
else if (tableNames.Contains("MSysRelationships")) else if (tableNames.Contains("MSysRelationships") || _msysNames.Contains("MSysRelationships"))
{ {
JetConfiguration.DetectedDualTableName = "MSysRelationships"; JetConfiguration.DetectedDualTableName = "MSysRelationships";
} }
@ -196,8 +199,13 @@ namespace EntityFrameworkCore.Jet.Scaffolding.Internal
? new DatabaseTable() { Database = databaseModel, Name = name! } ? new DatabaseTable() { Database = databaseModel, Name = name! }
: new DatabaseView() { 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; var isValidByFilter = filter?.Invoke(table.Schema!, table.Name) ?? true;
if (isValidByFilter) if (isValidByFilter && !(_ignoreMsys && isMsys))
{ {
tables.Add(table); tables.Add(table);
} }

Loading…
Cancel
Save