Upgrade scaffolding related files to 3.1.x.

The Jet DatabaseModelFactory class needs to be checked and tested and its code similarity to the SQL Server provider should be increased.
pull/41/head
Lau 6 years ago
parent 70f2b880ca
commit 6fffce90a8

@ -1,11 +1,19 @@
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. // Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using JetBrains.Annotations; using JetBrains.Annotations;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Design; using Microsoft.EntityFrameworkCore.Design;
using Microsoft.EntityFrameworkCore.Scaffolding; using Microsoft.EntityFrameworkCore.Scaffolding;
namespace EntityFrameworkCore.Jet.Scaffolding.Internal namespace EntityFrameworkCore.Jet.Scaffolding.Internal
{ {
/// <summary>
/// This is an internal API that supports the Entity Framework Core infrastructure and not subject to
/// the same compatibility standards as public APIs. It may be changed or removed without notice in
/// any release. You should only use it directly in your code with extreme caution and knowing that
/// doing so can result in application failures when updating to a new Entity Framework Core release.
/// </summary>
public class JetCodeGenerator : ProviderCodeGenerator public class JetCodeGenerator : ProviderCodeGenerator
{ {
/// <summary> /// <summary>
@ -18,17 +26,18 @@ namespace EntityFrameworkCore.Jet.Scaffolding.Internal
} }
/// <summary> /// <summary>
/// This API supports the Entity Framework Core infrastructure and is not intended to be used /// This is an internal API that supports the Entity Framework Core infrastructure and not subject to
/// directly from your code. This API may change or be removed in future releases. /// the same compatibility standards as public APIs. It may be changed or removed without notice in
/// any release. You should only use it directly in your code with extreme caution and knowing that
/// doing so can result in application failures when updating to a new Entity Framework Core release.
/// </summary> /// </summary>
public override MethodCallCodeFragment GenerateUseProvider( public override MethodCallCodeFragment GenerateUseProvider(
string connectionString, string connectionString,
MethodCallCodeFragment providerOptions) MethodCallCodeFragment providerOptions)
=> new MethodCallCodeFragment( => new MethodCallCodeFragment(
nameof(JetDbContextOptionsExtensions.UseJet), nameof(JetDbContextOptionsBuilderExtensions.UseJet),
providerOptions == null providerOptions == null
? new object[] { connectionString } ? new object[] { connectionString }
: new object[] { connectionString, new NestedClosureCodeFragment("x", providerOptions) }); : new object[] { connectionString, new NestedClosureCodeFragment("x", providerOptions) });
} }
} }

@ -8,7 +8,6 @@ using System.Data.Jet;
using System.Diagnostics; using System.Diagnostics;
using System.Linq; using System.Linq;
using EntityFrameworkCore.Jet.Internal; using EntityFrameworkCore.Jet.Internal;
using EntityFrameworkCore.Jet.Metadata.Internal;
using JetBrains.Annotations; using JetBrains.Annotations;
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Diagnostics; using Microsoft.EntityFrameworkCore.Diagnostics;
@ -16,7 +15,6 @@ using Microsoft.EntityFrameworkCore.Metadata;
using Microsoft.EntityFrameworkCore.Migrations; using Microsoft.EntityFrameworkCore.Migrations;
using Microsoft.EntityFrameworkCore.Scaffolding; using Microsoft.EntityFrameworkCore.Scaffolding;
using Microsoft.EntityFrameworkCore.Scaffolding.Metadata; using Microsoft.EntityFrameworkCore.Scaffolding.Metadata;
using Microsoft.EntityFrameworkCore.Scaffolding.Metadata.Internal;
using EntityFrameworkCore.Jet.Utilities; using EntityFrameworkCore.Jet.Utilities;
namespace EntityFrameworkCore.Jet.Scaffolding.Internal namespace EntityFrameworkCore.Jet.Scaffolding.Internal
@ -25,43 +23,30 @@ namespace EntityFrameworkCore.Jet.Scaffolding.Internal
/// 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.
/// </summary> /// </summary>
public class JetDatabaseModelFactory : IDatabaseModelFactory public class JetDatabaseModelFactory : DatabaseModelFactory
{ {
private DbConnection _connection; private DbConnection _connection;
private Version _serverVersion; private Version _serverVersion;
private HashSet<string> _tablesToInclude; private HashSet<string> _tablesToInclude;
private HashSet<string> _schemasToInclude;
private HashSet<string> _selectedSchemas;
private HashSet<string> _selectedTables; private HashSet<string> _selectedTables;
private DatabaseModel _databaseModel; private DatabaseModel _databaseModel;
private Dictionary<string, DatabaseTable> _tables; private Dictionary<string, DatabaseTable> _tables;
private Dictionary<string, DatabaseColumn> _tableColumns; private Dictionary<string, DatabaseColumn> _tableColumns;
/// <summary> private static string ObjectKey([NotNull] string name)
/// This API supports the Entity Framework Core infrastructure and is not intended to be used => "[" + name + "]";
/// directly from your code. This API may change or be removed in future releases.
/// </summary> private static string TableKey(DatabaseTable table)
private static string SchemaQualifiedKey([NotNull] string name, [CanBeNull] string schema = null) => "[" + (schema ?? "") + "].[" + name + "]"; => TableKey(table.Name);
private static string TableKey(DatabaseTable table) => SchemaQualifiedKey(table.Name, table.Schema); private static string TableKey(String tableName)
private static string ColumnKey(DatabaseTable table, string columnName) => TableKey(table) + ".[" + columnName + "]"; => ObjectKey(tableName);
private static readonly ISet<string> _dateTimePrecisionTypes = new HashSet<string> { "datetimeoffset", "datetime2", "time" }; private static string ColumnKey(DatabaseTable table, string columnName)
=> TableKey(table) + "." + ObjectKey(columnName);
// see https://msdn.microsoft.com/en-us/library/ff878091.aspx
private static readonly List<string> _schemaPatterns = new List<string>
{
"{schema}",
"[{schema}]"
};
private static readonly List<string> _tablePatterns = new List<string> private static readonly List<string> _tablePatterns = new List<string>
{ {
"{schema}.{table}",
"[{schema}].[{table}]",
"{schema}.[{table}]",
"[{schema}].{table}",
"{table}", "{table}",
"[{table}]" "[{table}]"
}; };
@ -88,39 +73,37 @@ namespace EntityFrameworkCore.Jet.Scaffolding.Internal
_connection = null; _connection = null;
_serverVersion = null; _serverVersion = null;
_selectedTables = new HashSet<string>(StringComparer.OrdinalIgnoreCase); _selectedTables = new HashSet<string>(StringComparer.OrdinalIgnoreCase);
_selectedSchemas = new HashSet<string>(StringComparer.OrdinalIgnoreCase);
_tablesToInclude = new HashSet<string>(StringComparer.OrdinalIgnoreCase); _tablesToInclude = new HashSet<string>(StringComparer.OrdinalIgnoreCase);
_schemasToInclude = new HashSet<string>(StringComparer.OrdinalIgnoreCase);
_databaseModel = new DatabaseModel(); _databaseModel = new DatabaseModel();
_tables = new Dictionary<string, DatabaseTable>(); _tables = new Dictionary<string, DatabaseTable>();
_tableColumns = new Dictionary<string, DatabaseColumn>(StringComparer.OrdinalIgnoreCase); _tableColumns = new Dictionary<string, DatabaseColumn>(StringComparer.OrdinalIgnoreCase);
} }
/// <summary> /// <summary>
/// This API supports the Entity Framework Core infrastructure and is not intended to be used /// This is an internal API that supports the Entity Framework Core infrastructure and not subject to
/// directly from your code. This API may change or be removed in future releases. /// the same compatibility standards as public APIs. It may be changed or removed without notice in
/// any release. You should only use it directly in your code with extreme caution and knowing that
/// doing so can result in application failures when updating to a new Entity Framework Core release.
/// </summary> /// </summary>
public virtual DatabaseModel Create(string connectionString, IEnumerable<string> tables, IEnumerable<string> schemas) public override DatabaseModel Create(string connectionString, DatabaseModelFactoryOptions options)
{ {
Check.NotEmpty(connectionString, nameof(connectionString)); Check.NotEmpty(connectionString, nameof(connectionString));
Check.NotNull(tables, nameof(tables)); Check.NotNull(options, nameof(options));
Check.NotNull(schemas, nameof(schemas));
using (var connection = new JetConnection(connectionString)) using var connection = new JetConnection(connectionString);
{ return Create(connection, options);
return Create(connection, tables, schemas);
}
} }
/// <summary> /// <summary>
/// This API supports the Entity Framework Core infrastructure and is not intended to be used /// This is an internal API that supports the Entity Framework Core infrastructure and not subject to
/// directly from your code. This API may change or be removed in future releases. /// the same compatibility standards as public APIs. It may be changed or removed without notice in
/// any release. You should only use it directly in your code with extreme caution and knowing that
/// doing so can result in application failures when updating to a new Entity Framework Core release.
/// </summary> /// </summary>
public virtual DatabaseModel Create(DbConnection connection, IEnumerable<string> tables, IEnumerable<string> schemas) public override DatabaseModel Create(DbConnection connection, DatabaseModelFactoryOptions options)
{ {
Check.NotNull(connection, nameof(connection)); Check.NotNull(connection, nameof(connection));
Check.NotNull(tables, nameof(tables)); Check.NotNull(options, nameof(options));
Check.NotNull(schemas, nameof(schemas));
ResetState(); ResetState();
@ -131,23 +114,20 @@ namespace EntityFrameworkCore.Jet.Scaffolding.Internal
{ {
_connection.Open(); _connection.Open();
} }
try try
{ {
foreach (var schema in schemas) foreach (var table in options.Tables)
{
_schemasToInclude.Add(schema);
}
foreach (var table in tables)
{ {
_tablesToInclude.Add(table); _tablesToInclude.Add(table);
} }
_databaseModel.DefaultSchema = null;
_databaseModel.DatabaseName = _connection.Database; _databaseModel.DatabaseName = _connection.Database;
// CHECK: Is this actually set?
Version.TryParse(_connection.ServerVersion, out _serverVersion); Version.TryParse(_connection.ServerVersion, out _serverVersion);
GetDefaultSchema();
GetTables(); GetTables();
GetColumns(); GetColumns();
GetPrimaryKeys(); GetPrimaryKeys();
@ -170,30 +150,17 @@ namespace EntityFrameworkCore.Jet.Scaffolding.Internal
private void CheckSelectionsMatched() private void CheckSelectionsMatched()
{ {
foreach (var schema in _schemasToInclude.Except(_selectedSchemas, StringComparer.OrdinalIgnoreCase))
{
Logger.MissingSchemaWarning(schema);
}
foreach (var table in _tablesToInclude.Except(_selectedTables, StringComparer.OrdinalIgnoreCase)) foreach (var table in _tablesToInclude.Except(_selectedTables, StringComparer.OrdinalIgnoreCase))
{ {
Logger.MissingTableWarning(table); Logger.MissingTableWarning(table);
} }
} }
private void GetDefaultSchema()
{
_databaseModel.DefaultSchema = "Jet";
}
private void GetTables() private void GetTables()
{ {
var command = _connection.CreateCommand(); var command = _connection.CreateCommand();
command.CommandText = command.CommandText = $"SHOW TABLES WHERE Name <> '{HistoryRepository.DefaultTableName}'";
$"SHOW TABLES WHERE Name <> '{HistoryRepository.DefaultTableName}'";
using (var reader = command.ExecuteReader()) using (var reader = command.ExecuteReader())
{ {
while (reader.Read()) while (reader.Read())
@ -201,13 +168,13 @@ namespace EntityFrameworkCore.Jet.Scaffolding.Internal
var table = new DatabaseTable var table = new DatabaseTable
{ {
Database = _databaseModel, Database = _databaseModel,
Schema = "Jet", Schema = null,
Name = reader.GetValueOrDefault<string>("Name") Name = reader.GetValueOrDefault<string>("Name")
}; };
if (AllowsTable(table.Schema, table.Name)) if (AllowsTable(table.Name))
{ {
Logger.TableFound(DisplayName(table.Schema, table.Name)); Logger.TableFound(table.Name);
_databaseModel.Tables.Add(table); _databaseModel.Tables.Add(table);
_tables[TableKey(table)] = table; _tables[TableKey(table)] = table;
} }
@ -215,27 +182,16 @@ namespace EntityFrameworkCore.Jet.Scaffolding.Internal
} }
} }
private bool AllowsTable(string schema, string table) private bool AllowsTable(string table)
{ {
if (_schemasToInclude.Count == 0 if (_tablesToInclude.Count == 0)
&& _tablesToInclude.Count == 0)
{ {
return true; return true;
} }
foreach (var schemaPattern in _schemaPatterns)
{
var key = schemaPattern.Replace("{schema}", schema);
if (_schemasToInclude.Contains(key))
{
_selectedSchemas.Add(schema);
return true;
}
}
foreach (var tablePattern in _tablePatterns) foreach (var tablePattern in _tablePatterns)
{ {
var key = tablePattern.Replace("{schema}", schema).Replace("{table}", table); var key = tablePattern.Replace("{table}", table);
if (_tablesToInclude.Contains(key)) if (_tablesToInclude.Contains(key))
{ {
_selectedTables.Add(key); _selectedTables.Add(key);
@ -260,41 +216,40 @@ ORDER BY
{ {
while (reader.Read()) while (reader.Read())
{ {
var schemaName = "Jet";
var tableName = reader.GetValueOrDefault<string>("Table"); var tableName = reader.GetValueOrDefault<string>("Table");
var columnName = reader.GetValueOrDefault<string>("Name"); var columnName = reader.GetValueOrDefault<string>("Name");
var dataTypeName = reader.GetValueOrDefault<string>("TypeName"); var dataTypeName = reader.GetValueOrDefault<string>("TypeName");
var dataTypeSchemaName = "Jet";
var ordinal = reader.GetValueOrDefault<int>("Ordinal"); var ordinal = reader.GetValueOrDefault<int>("Ordinal");
var nullable = reader.GetValueOrDefault<bool>("IsNullable"); var nullable = reader.GetValueOrDefault<bool>("IsNullable");
// ReSharper disable once UnusedVariable // ReSharper disable once UnusedVariable
var primaryKeyOrdinal = reader.GetValueOrDefault<bool>("IsKey") ? (int?)reader.GetValueOrDefault<int>("Ordinal") : null; var primaryKeyOrdinal = reader.GetValueOrDefault<bool>("IsKey")
? (int?) reader.GetValueOrDefault<int>("Ordinal")
: null;
var defaultValue = reader.GetValueOrDefault<string>("Default"); var defaultValue = reader.GetValueOrDefault<string>("Default");
var computedValue = (string)null;
var precision = reader.GetValueOrDefault<int?>("Precision"); var precision = reader.GetValueOrDefault<int?>("Precision");
var scale = reader.GetValueOrDefault<int?>("Scale"); var scale = reader.GetValueOrDefault<int?>("Scale");
var maxLength = reader.GetValueOrDefault<int?>("MaxLength"); var maxLength = reader.GetValueOrDefault<int?>("MaxLength");
var isIdentity = reader.GetValueOrDefault<bool>("IsIdentity"); var isIdentity = reader.GetValueOrDefault<bool>("IsIdentity");
Logger.ColumnFound( Logger.ColumnFound(
DisplayName(schemaName, tableName), tableName,
columnName, columnName,
ordinal, ordinal,
DisplayName(dataTypeSchemaName, dataTypeName), dataTypeName,
maxLength, maxLength ?? -1,
precision, precision ?? 0,
scale, scale ?? 0,
nullable, nullable,
isIdentity, isIdentity,
defaultValue, defaultValue,
computedValue); null);
if (!_tables.TryGetValue(SchemaQualifiedKey(tableName, schemaName), out var table)) if (!_tables.TryGetValue(TableKey(tableName), out var table))
continue; continue;
string storeType; var storeType = GetStoreType(dataTypeName, precision, scale, maxLength);
storeType = GetStoreType(dataTypeName, precision, scale, maxLength);
// CHECK: Jet behavior.
if (defaultValue == "(NULL)") if (defaultValue == "(NULL)")
{ {
defaultValue = null; defaultValue = null;
@ -307,17 +262,18 @@ ORDER BY
StoreType = storeType, StoreType = storeType,
IsNullable = nullable, IsNullable = nullable,
DefaultValueSql = defaultValue, DefaultValueSql = defaultValue,
ComputedColumnSql = computedValue, ComputedColumnSql = null,
ValueGenerated = isIdentity ValueGenerated = isIdentity
? ValueGenerated.OnAdd ? ValueGenerated.OnAdd
: (storeType) == "rowversion" : storeType == "timestamp"
? ValueGenerated.OnAddOrUpdate ? ValueGenerated.OnAddOrUpdate
: default(ValueGenerated?) : default(ValueGenerated?)
}; };
if (storeType == "rowversion") if (storeType == "timestamp")
{ {
column[ScaffoldingAnnotationNames.ConcurrencyToken] = true; // Note: annotation name must match `ScaffoldingAnnotationNames.ConcurrencyToken`
column["ConcurrencyToken"] = true;
} }
table.Columns.Add(column); table.Columns.Add(column);
@ -328,36 +284,28 @@ ORDER BY
private string GetStoreType(string dataTypeName, int? precision, int? scale, int? maxLength) private string GetStoreType(string dataTypeName, int? precision, int? scale, int? maxLength)
{ {
if (dataTypeName == "decimal" if (string.Equals(dataTypeName, "decimal", StringComparison.OrdinalIgnoreCase) ||
|| dataTypeName == "numeric") string.Equals(dataTypeName, "numeric", StringComparison.OrdinalIgnoreCase))
{ {
return $"{dataTypeName}({precision}, {scale.GetValueOrDefault(0)})"; return $"{dataTypeName}({precision}, {scale.GetValueOrDefault(0)})";
} }
if (_dateTimePrecisionTypes.Contains(dataTypeName)
&& scale != null) if (maxLength.HasValue)
{
return $"{dataTypeName}({scale})";
}
if (maxLength == -1)
{ {
if (string.Equals(dataTypeName, "varchar", StringComparison.InvariantCultureIgnoreCase)) if (maxLength == -1)
return "text"; {
else if (string.Equals(dataTypeName, "varbinary", StringComparison.InvariantCultureIgnoreCase)) if (string.Equals(dataTypeName, "varchar", StringComparison.OrdinalIgnoreCase))
return "image"; return "longchar";
else
throw new InvalidOperationException("Unexpected type " + dataTypeName);
}
if (dataTypeName == "timestamp") if (string.Equals(dataTypeName, "varbinary", StringComparison.OrdinalIgnoreCase))
return "rowversion"; return "longbinary";
if (dataTypeName == "bit") throw new InvalidOperationException("Unexpected type " + dataTypeName);
{ }
return "bit";
}
if (maxLength.HasValue && maxLength > 0) if (maxLength > 0)
return $"{dataTypeName}({maxLength.Value})"; return $"{dataTypeName}({maxLength.Value})";
}
return dataTypeName; return dataTypeName;
} }
@ -378,10 +326,8 @@ ORDER BY
DatabasePrimaryKey primaryKey = null; DatabasePrimaryKey primaryKey = null;
while (reader.Read()) while (reader.Read())
{ {
var schemaName = "Jet";
var tableName = reader.GetValueOrDefault<string>("TableName"); var tableName = reader.GetValueOrDefault<string>("TableName");
var indexName = reader.GetValueOrDefault<string>("ConstraintName"); var indexName = reader.GetValueOrDefault<string>("ConstraintName");
var typeDesc = reader.GetValueOrDefault<string>("ConstraintType");
var columnName = reader.GetValueOrDefault<string>("ColumnName"); var columnName = reader.GetValueOrDefault<string>("ColumnName");
// ReSharper disable once UnusedVariable // ReSharper disable once UnusedVariable
var indexOrdinal = reader.GetValueOrDefault<int>("ColumnOrdinal"); var indexOrdinal = reader.GetValueOrDefault<int>("ColumnOrdinal");
@ -390,16 +336,14 @@ ORDER BY
if (primaryKey == null if (primaryKey == null
|| primaryKey.Name != indexName || primaryKey.Name != indexName
// ReSharper disable once PossibleNullReferenceException // ReSharper disable once PossibleNullReferenceException
|| primaryKey.Table.Name != tableName || primaryKey.Table.Name != tableName)
|| primaryKey.Table.Schema != schemaName)
{ {
if (!_tables.TryGetValue(SchemaQualifiedKey(tableName, schemaName), out var table)) if (!_tables.TryGetValue(TableKey(tableName), out var table))
{ {
continue; continue;
} }
Logger.PrimaryKeyFound( Logger.PrimaryKeyFound(indexName, tableName);
indexName, DisplayName(schemaName, tableName));
primaryKey = new DatabasePrimaryKey primaryKey = new DatabasePrimaryKey
{ {
@ -407,11 +351,6 @@ ORDER BY
Name = indexName Name = indexName
}; };
if (typeDesc == "NONCLUSTERED")
{
primaryKey[JetAnnotationNames.Clustered] = false;
}
Debug.Assert(table.PrimaryKey == null); Debug.Assert(table.PrimaryKey == null);
table.PrimaryKey = primaryKey; table.PrimaryKey = primaryKey;
} }
@ -440,10 +379,9 @@ ORDER BY
DatabaseUniqueConstraint uniqueConstraint = null; DatabaseUniqueConstraint uniqueConstraint = null;
while (reader.Read()) while (reader.Read())
{ {
var schemaName = "Jet"; var schemaName = "Jet"; // TODO: Change to `null`.
var tableName = reader.GetValueOrDefault<string>("TableName"); var tableName = reader.GetValueOrDefault<string>("TableName");
var indexName = reader.GetValueOrDefault<string>("ConstraintName"); var indexName = reader.GetValueOrDefault<string>("ConstraintName");
var typeDesc = reader.GetValueOrDefault<string>("ConstraintType");
var columnName = reader.GetValueOrDefault<string>("ColumnName"); var columnName = reader.GetValueOrDefault<string>("ColumnName");
// ReSharper disable once UnusedVariable // ReSharper disable once UnusedVariable
var indexOrdinal = reader.GetValueOrDefault<int>("ColumnOrdinal"); var indexOrdinal = reader.GetValueOrDefault<int>("ColumnOrdinal");
@ -455,12 +393,12 @@ ORDER BY
|| uniqueConstraint.Table.Name != tableName || uniqueConstraint.Table.Name != tableName
|| uniqueConstraint.Table.Schema != schemaName) || uniqueConstraint.Table.Schema != schemaName)
{ {
if (!_tables.TryGetValue(SchemaQualifiedKey(tableName, schemaName), out var table)) if (!_tables.TryGetValue(TableKey(tableName), out var table))
{ {
continue; continue;
} }
Logger.UniqueConstraintFound(indexName, DisplayName(schemaName, tableName)); Logger.UniqueConstraintFound(indexName, tableName);
uniqueConstraint = new DatabaseUniqueConstraint uniqueConstraint = new DatabaseUniqueConstraint
{ {
@ -468,11 +406,6 @@ ORDER BY
Name = indexName Name = indexName
}; };
if (typeDesc == "CLUSTERED")
{
uniqueConstraint[JetAnnotationNames.Clustered] = true;
}
table.UniqueConstraints.Add(uniqueConstraint); table.UniqueConstraints.Add(uniqueConstraint);
} }
@ -502,11 +435,10 @@ ORDER BY
DatabaseIndex index = null; DatabaseIndex index = null;
while (reader.Read()) while (reader.Read())
{ {
var schemaName = "Jet"; var schemaName = "Jet"; // TODO: Change to `null`.
var tableName = reader.GetValueOrDefault<string>("Table"); var tableName = reader.GetValueOrDefault<string>("Table");
var indexName = reader.GetValueOrDefault<string>("Index"); var indexName = reader.GetValueOrDefault<string>("Index");
var isUnique = reader.GetValueOrDefault<bool>("IsUnique"); var isUnique = reader.GetValueOrDefault<bool>("IsUnique");
var typeDesc = "NON CLUSTERED";
var columnName = reader.GetValueOrDefault<string>("Name"); var columnName = reader.GetValueOrDefault<string>("Name");
// ReSharper disable once UnusedVariable // ReSharper disable once UnusedVariable
var indexOrdinal = reader.GetValueOrDefault<int>("Ordinal"); var indexOrdinal = reader.GetValueOrDefault<int>("Ordinal");
@ -518,12 +450,12 @@ ORDER BY
|| index.Table.Name != tableName || index.Table.Name != tableName
|| index.Table.Schema != schemaName) || index.Table.Schema != schemaName)
{ {
if (!_tables.TryGetValue(SchemaQualifiedKey(tableName, schemaName), out var table)) if (!_tables.TryGetValue(TableKey(tableName), out var table))
{ {
continue; continue;
} }
Logger.IndexFound(indexName, DisplayName(schemaName, tableName), isUnique); Logger.IndexFound(indexName, tableName, isUnique);
index = new DatabaseIndex index = new DatabaseIndex
{ {
@ -533,11 +465,6 @@ ORDER BY
Filter = null Filter = null
}; };
if (typeDesc == "CLUSTERED")
{
index[JetAnnotationNames.Clustered] = true;
}
table.Indexes.Add(index); table.Indexes.Add(index);
} }
@ -568,10 +495,10 @@ ORDER BY
DatabaseForeignKey foreignKey = null; DatabaseForeignKey foreignKey = null;
while (reader.Read()) while (reader.Read())
{ {
var schemaName = "Jet"; var schemaName = "Jet"; // TODO: Change to `null`.
var tableName = reader.GetValueOrDefault<string>("FromTable"); var tableName = reader.GetValueOrDefault<string>("FromTable");
var constraintName = reader.GetValueOrDefault<string>("ConstraintId"); var constraintName = reader.GetValueOrDefault<string>("ConstraintId");
var principalTableSchemaName = "Jet"; var principalTableSchemaName = "Jet"; // TODO: Change to `null`.
var principalTableName = reader.GetValueOrDefault<string>("ToTable"); var principalTableName = reader.GetValueOrDefault<string>("ToTable");
var fromColumnName = reader.GetValueOrDefault<string>("FromColumn"); var fromColumnName = reader.GetValueOrDefault<string>("FromColumn");
var toColumnName = reader.GetValueOrDefault<string>("ToColumn"); var toColumnName = reader.GetValueOrDefault<string>("ToColumn");
@ -583,8 +510,8 @@ ORDER BY
Logger.ForeignKeyFound( Logger.ForeignKeyFound(
constraintName, constraintName,
DisplayName(schemaName, tableName), tableName,
DisplayName(schemaName, principalTableName), principalTableName,
deleteAction); deleteAction);
if (foreignKey == null if (foreignKey == null
@ -596,7 +523,7 @@ ORDER BY
lastFkSchemaName = schemaName; lastFkSchemaName = schemaName;
lastFkTableName = tableName; lastFkTableName = tableName;
if (!_tables.TryGetValue(SchemaQualifiedKey(tableName, schemaName), out var table)) if (!_tables.TryGetValue(TableKey(tableName), out var table))
{ {
continue; continue;
} }
@ -605,13 +532,13 @@ ORDER BY
if (!string.IsNullOrEmpty(principalTableSchemaName) if (!string.IsNullOrEmpty(principalTableSchemaName)
&& !string.IsNullOrEmpty(principalTableName)) && !string.IsNullOrEmpty(principalTableName))
{ {
_tables.TryGetValue(SchemaQualifiedKey(principalTableName, principalTableSchemaName), out principalTable); _tables.TryGetValue(TableKey(principalTableName), out principalTable);
} }
if (principalTable == null) if (principalTable == null)
{ {
Logger.ForeignKeyReferencesMissingPrincipalTableWarning( Logger.ForeignKeyReferencesMissingPrincipalTableWarning(
constraintName, DisplayName(schemaName, tableName), DisplayName(principalTableSchemaName, principalTableName)); constraintName, tableName, principalTableName);
} }
foreignKey = new DatabaseForeignKey foreignKey = new DatabaseForeignKey
@ -643,9 +570,6 @@ ORDER BY
} }
} }
private static string DisplayName(string schema, string name)
=> (!string.IsNullOrEmpty(schema) ? schema + "." : "") + name;
private static ReferentialAction? ConvertToReferentialAction(string onDeleteAction) private static ReferentialAction? ConvertToReferentialAction(string onDeleteAction)
{ {
switch (onDeleteAction.ToUpperInvariant()) switch (onDeleteAction.ToUpperInvariant())
@ -670,4 +594,4 @@ ORDER BY
} }
} }
} }
} }
Loading…
Cancel
Save