in EFCore/src/Scaffolding/Internal/MySQLDatabaseModelFactory.cs [366:447]
private void GetColumns(DbConnection connection, IReadOnlyList<DatabaseTable> tables, string tableFilter)
{
using (var command = connection.CreateCommand())
{
command.CommandText = string.Format(GetColumnsQuery, tableFilter);
using (var reader = command.ExecuteReader())
{
var tableColumnGroups = reader.Cast<DbDataRecord>()
.GroupBy(
ddr => (tableSchema: ddr.GetValueOrDefault<string>("TABLE_SCHEMA"),
tableName: ddr.GetValueOrDefault<string>("TABLE_NAME")));
foreach (var tableColumnGroup in tableColumnGroups)
{
var tableSchema = tableColumnGroup.Key.tableSchema;
var tableName = tableColumnGroup.Key.tableName;
var table = tables.Single(t => t.Schema == tableSchema && t.Name == tableName);
foreach (var dataRecord in tableColumnGroup)
{
var name = dataRecord.GetValueOrDefault<string>("COLUMN_NAME");
var defaultValue = dataRecord.GetValueOrDefault<string>("COLUMN_DEFAULT");
var nullable = dataRecord.GetValueOrDefault<string>("IS_NULLABLE")!.Contains("YES");
var dataType = dataRecord.GetValueOrDefault<string>("DATA_TYPE");
var charset = dataRecord.GetValueOrDefault<string>("CHARACTER_SET_NAME");
var collation = dataRecord.GetValueOrDefault<string>("COLLATION_NAME");
var columType = dataRecord.GetValueOrDefault<string>("COLUMN_TYPE");
var extra = dataRecord.GetValueOrDefault<string>("EXTRA");
var comment = dataRecord.GetValueOrDefault<string>("COLUMN_COMMENT");
ValueGenerated valueGenerated;
if (extra!.IndexOf("auto_increment", StringComparison.Ordinal) >= 0)
{
valueGenerated = ValueGenerated.OnAdd;
}
else if (extra.IndexOf("on update", StringComparison.Ordinal) >= 0)
{
if (defaultValue != null && extra.IndexOf(defaultValue, StringComparison.Ordinal) > 0 ||
(string.Equals(dataType, "timestamp", StringComparison.OrdinalIgnoreCase) ||
string.Equals(dataType, "datetime", StringComparison.OrdinalIgnoreCase)) &&
extra.IndexOf("CURRENT_TIMESTAMP", StringComparison.Ordinal) > 0)
{
valueGenerated = ValueGenerated.OnAddOrUpdate;
}
else
{
if (defaultValue != null)
{
valueGenerated = ValueGenerated.OnAddOrUpdate;
}
else
{
valueGenerated = ValueGenerated.OnUpdate;
}
}
}
else
{
valueGenerated = ValueGenerated.Never;
}
defaultValue = FilterClrDefaults(dataType!, nullable, defaultValue);
var column = new DatabaseColumn
{
Table = table,
Name = name!,
StoreType = columType,
IsNullable = nullable,
DefaultValueSql = CreateDefaultValueString(defaultValue, dataType!),
ValueGenerated = valueGenerated,
Comment = string.IsNullOrEmpty(comment) ? null : comment
};
table.Columns.Add(column);
}
}
}
}
}