void ProcessTableNames(IDictionary <string, EntityMap> entities, IDictionary <string, string> entityRenames) { var tableNamer = transfactory.GetTransformer <EntityMap>(); var relNamer = transfactory.GetTransformer <Relation>(); var propNamer = transfactory.GetTransformer <Property>(); foreach (var table in entities.Values) { table.Name = GetRename(tableNamer, table, entityRenames); table.TableAlias = tableAbbreviator.Abbreviate(table.Name).ToLower(); var propertyListClone = table.ToArray(); logger.Log(LogLevel.Info, $"Processing table {table.SchemaName}.{table.TableName}"); List <Property> additionalProperties = new List <Property>(); foreach (var prop in propertyListClone) { if (prop is Relation) { var rel = (Relation)prop; var refTblKey = GetTableKeyName(rel); if (entities.TryGetValue(refTblKey, out var refEnt)) { rel.ReferenceEntityName = $"{refEnt.Namespace}.{GetRename(tableNamer, refEnt, entityRenames)}"; } string name = relNamer.Transform(rel, rel.ColumnName); if (!string.IsNullOrWhiteSpace(rel.MapPropertyName)) { string mapPropName = propNamer.Transform(rel, rel.MapPropertyName); rel.MapPropertyName = mapPropName; } if (rel.RelationType == RelationshipType.ManyToOne) { Property newProperty = rel.Clone(); if (rel.IsPrimaryKey) { newProperty.IsPrimaryKey = false; } newProperty.PropertyName = propNamer.Transform(rel, rel.ColumnName); table.Remove(rel); rel.PropertyName = name; if (table.ContainsProperty(name)) { var pcount = table.Properties.Count(p => p.PropertyName.StartsWith(newProperty.PropertyName)) + table.Relations.Count(p => p.PropertyName.StartsWith(newProperty.PropertyName)); rel.PropertyName = $"{name}{pcount + 1}"; } if (rel.PropertyName.Equals(newProperty.PropertyName)) { rel.PropertyName = string.Concat(name, "Entity"); } logger.Log(LogLevel.Debug, $"\tRelationship {rel.PropertyName} | {newProperty.ColumnName} <-> {newProperty.PropertyName}"); table.Add(rel); additionalProperties.Add(newProperty); } if (!string.IsNullOrWhiteSpace(rel.ReferenceProperty)) { rel.ReferenceProperty = propNamer.Transform(rel, rel.ReferenceProperty); } } else { prop.PropertyName = propNamer.Transform(prop, prop.ColumnName); } if (prop.PropertyName.Equals(table.Name)) { //member name cannot be the same as enclosing type. We rename prop.PropertyName = prop.PropertyName + "Property"; } } table.IsLinkTable = IsLinkTable(table); table.AddColumnRange(additionalProperties); if (!table.IsLinkTable && table.PrimaryKey != null) { foreach (var pk in table.PrimaryKey.Keys) { if (pk.Key.DbType == System.Data.DbType.Guid) { pk.KeyGenerationStrategy = Generators.GuidCombGenerator.GeneratorName; pk.UnsavedValueString = Guid.Empty.ToString(); } else if (pk.Key.IsIdentity) { pk.KeyGenerationStrategy = Generators.AutoIncrementGenerator.GeneratorName; pk.UnsavedValueString = "0"; } } } } }