protected virtual string GetColumnName(IModelInspector modelInspector, PropertyPath member)
        {
            string defaultColumnName = member.ToColumnName();
            string columnPrefix      = null;
            string columnName        = null;

            Type currentType  = member.LocalMember.ReflectedType;
            bool walkToParent = modelInspector.IsTablePerClassHierarchy(currentType);

            while (currentType != null && currentType != typeof(object))
            {
                ModelMetaData modelMetaData;
                if (ModelMetaDatasByType.TryGetValue(currentType, out modelMetaData))
                {
                    columnPrefix = modelMetaData.ColumnPrefix;
                    modelMetaData.ColumnNames.TryGetValue(defaultColumnName, out columnName);
                    break;
                }

                currentType = walkToParent ? currentType.BaseType : null;
            }

            string result = string.Concat(columnPrefix, columnName ?? GetIdentifier(defaultColumnName));

            return(result);
        }
        protected virtual string GetTableName(IModelInspector modelInspector, Type type)
        {
            ModelMetaData modelMetaData;
            string        tableName = null;

            if (ModelMetaDatasByType.TryGetValue(type, out modelMetaData))
            {
                tableName = modelMetaData.TableName;
            }

            string result = tableName ?? GetIdentifier(type.Name);

            return(result);
        }
        public virtual string GetVersionColumnName(IModelInspector modelInspector, Type type)
        {
            string        defaultColumnName = @"PersistenceVersion";
            string        columnPrefix      = null;
            string        versionColumnName = null;
            ModelMetaData modelMetaData;

            // ReSharper disable once AssignNullToNotNullAttribute
            if (ModelMetaDatasByType.TryGetValue(type, out modelMetaData))
            {
                columnPrefix      = modelMetaData.ColumnPrefix;
                versionColumnName = modelMetaData.Version;
            }

            string result = string.Concat(columnPrefix, versionColumnName ?? GetIdentifier(defaultColumnName));

            return(result);
        }
        protected virtual string GetKeyColumnName(IModelInspector modelInspector, Type type, bool foreignKey)
        {
            ModelMetaData modelMetaData;
            string        columnPrefix = null;
            string        tableName    = null;

            if (ModelMetaDatasByType.TryGetValue(type, out modelMetaData))
            {
                tableName    = modelMetaData.TableName;
                columnPrefix = modelMetaData.ColumnPrefix;
            }

            string             result;
            PrimaryKeyTypeEnum primaryKeyType = foreignKey ? PrimaryKeyTypeEnum.TYPE_ID : PrimaryKeyType;

            switch (primaryKeyType)
            {
            case PrimaryKeyTypeEnum.ID:
                result = string.Concat(columnPrefix, GetIdentifier(@"Id"));
                break;

            case PrimaryKeyTypeEnum.TYPE_ID:
                if (string.IsNullOrWhiteSpace(tableName))
                {
                    result = string.Concat(columnPrefix, GetIdentifier(string.Concat(type.Name, @"Id")));
                }
                else
                {
                    result = UseCamelCaseUnderScoreForDbObjects
                                     ? string.Concat(columnPrefix, tableName, tableName.EndsWith(@"_") ? @"ID" : @"_ID")
                                     : string.Concat(columnPrefix, tableName, @"Id");
                }
                break;

            default:
                throw new ArgumentOutOfRangeException();
            }

            return(result);
        }