示例#1
0
        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";
                        }
                    }
                }
            }
        }