예제 #1
0
        /// <summary>
        ///     Returns the default key constraint name that would be used for this key.
        /// </summary>
        /// <param name="key"> The key. </param>
        /// <returns> The default key constraint name that would be used for this key. </returns>
        public static string GetDefaultName([NotNull] this IKey key)
        {
            var sharedTablePrincipalPrimaryKeyProperty = key.Properties[0].FindSharedRootPrimaryKeyProperty();

            if (sharedTablePrincipalPrimaryKeyProperty != null)
            {
                return(sharedTablePrincipalPrimaryKeyProperty.FindContainingPrimaryKey().GetName());
            }

            var builder   = new StringBuilder();
            var tableName = key.DeclaringEntityType.GetTableName() ?? key.DeclaringEntityType.GetViewName();

            if (key.IsPrimaryKey())
            {
                builder
                .Append("PK_")
                .Append(tableName);
            }
            else
            {
                builder
                .Append("AK_")
                .Append(tableName)
                .Append("_")
                .AppendJoin(key.Properties.Select(p => p.GetColumnName()), "_");
            }

            return(Uniquifier.Truncate(builder.ToString(), key.DeclaringEntityType.Model.GetMaxIdentifierLength()));
        }
    /// <summary>
    ///     Returns the default table name that would be used for this entity type.
    /// </summary>
    /// <param name="entityType">The entity type to get the table name for.</param>
    /// <param name="truncate">A value indicating whether the name should be truncated to the max identifier length.</param>
    /// <returns>The default name of the table to which the entity type would be mapped.</returns>
    public static string?GetDefaultTableName(this IReadOnlyEntityType entityType, bool truncate = true)
    {
        var ownership = entityType.FindOwnership();

        if (ownership != null &&
            ownership.IsUnique)
        {
            return(ownership.PrincipalEntityType.GetTableName());
        }

        var name = entityType.ShortName();

        if (entityType.HasSharedClrType &&
            ownership != null
#pragma warning disable EF1001 // Internal EF Core API usage.
            && entityType.Name == ownership.PrincipalEntityType.GetOwnedName(name, ownership.PrincipalToDependent !.Name))
#pragma warning restore EF1001 // Internal EF Core API usage.
        {
            var ownerTypeTable = ownership.PrincipalEntityType.GetTableName();
            name = ownerTypeTable != null
                ? $"{ownerTypeTable}_{ownership.PrincipalToDependent.Name}"
                : $"{ownership.PrincipalToDependent.Name}_{name}";
        }

        return(truncate
            ? Uniquifier.Truncate(name, entityType.Model.GetMaxIdentifierLength())
            : name);
    }
예제 #3
0
        /// <summary>
        ///     Returns the default name that would be used for this index.
        /// </summary>
        /// <param name="index"> The index. </param>
        /// <param name="storeObject"> The identifier of the store object. </param>
        /// <returns> The default name that would be used for this index. </returns>
        public static string GetDefaultDatabaseName([NotNull] this IIndex index, StoreObjectIdentifier storeObject)
        {
            var propertyNames = index.Properties.Select(p => p.GetColumnName(storeObject)).ToList();
            var rootIndex     = index;

            // Limit traversal to avoid getting stuck in a cycle (validation will throw for these later)
            // Using a hashset is detrimental to the perf when there are no cycles
            for (var i = 0; i < Metadata.Internal.RelationalEntityTypeExtensions.MaxEntityTypesSharingTable; i++)
            {
                var linkedIndex = rootIndex.DeclaringEntityType
                                  .FindRowInternalForeignKeys(storeObject)
                                  .SelectMany(fk => fk.PrincipalEntityType.GetIndexes())
                                  .FirstOrDefault(i => i.Properties.Select(p => p.GetColumnName(storeObject)).SequenceEqual(propertyNames));
                if (linkedIndex == null)
                {
                    break;
                }

                rootIndex = linkedIndex;
            }

            if (rootIndex != index)
            {
                return(rootIndex.GetDatabaseName(storeObject));
            }

            var baseName = new StringBuilder()
                           .Append("IX_")
                           .Append(storeObject.Name)
                           .Append("_")
                           .AppendJoin(propertyNames, "_")
                           .ToString();

            return(Uniquifier.Truncate(baseName, index.DeclaringEntityType.Model.GetMaxIdentifierLength()));
        }
예제 #4
0
        private static string GetDefaultName(IIndex index)
        {
            var baseName = new StringBuilder()
                           .Append(index.DeclaringEntityType.GetTableName())
                           .Append("_ix_")
                           .AppendJoin("_", index.Properties.Select(p => p.GetColumnName()))
                           .ToString();

            return(Uniquifier.Truncate(baseName, index.DeclaringEntityType.Model.GetMaxIdentifierLength()));
        }
    /// <summary>
    ///     Returns the default name that would be used for this index.
    /// </summary>
    /// <param name="index">The index.</param>
    /// <returns>The default name that would be used for this index.</returns>
    public static string GetDefaultDatabaseName(this IReadOnlyIndex index)
    {
        var tableName = index.DeclaringEntityType.GetTableName();
        var baseName  = new StringBuilder()
                        .Append("IX_")
                        .Append(tableName)
                        .Append('_')
                        .AppendJoin(index.Properties.Select(p => p.GetColumnBaseName()), "_")
                        .ToString();

        return(Uniquifier.Truncate(baseName, index.DeclaringEntityType.Model.GetMaxIdentifierLength()));
    }
        /// <summary>
        ///     Returns the default column name to which the property would be mapped.
        /// </summary>
        /// <param name="property"> The property. </param>
        /// <returns> The default column name to which the property would be mapped. </returns>
        public static string GetDefaultColumnName([NotNull] this IProperty property)
        {
            var sharedTablePrincipalPrimaryKeyProperty = property.FindSharedTableRootPrimaryKeyProperty();

            if (sharedTablePrincipalPrimaryKeyProperty != null)
            {
                return(sharedTablePrincipalPrimaryKeyProperty.GetColumnName());
            }

            var           entityType = property.DeclaringEntityType;
            StringBuilder builder    = null;

            do
            {
                var ownership = entityType.GetForeignKeys().SingleOrDefault(fk => fk.IsOwnership);
                if (ownership == null)
                {
                    entityType = null;
                }
                else
                {
                    var ownerType = ownership.PrincipalEntityType;
                    var table     = entityType.GetTableName();
                    if (table != null &&
                        table == ownerType.GetTableName() &&
                        entityType.GetSchema() == ownerType.GetSchema())
                    {
                        if (builder == null)
                        {
                            builder = new StringBuilder();
                        }

                        builder.Insert(0, "_");
                        builder.Insert(0, ownership.PrincipalToDependent.Name);
                        entityType = ownerType;
                    }
                    else
                    {
                        entityType = null;
                    }
                }
            }while (entityType != null);

            var baseName = property.Name;

            if (builder != null)
            {
                builder.Append(baseName);
                baseName = builder.ToString();
            }

            return(Uniquifier.Truncate(baseName, property.DeclaringEntityType.Model.GetMaxIdentifierLength()));
        }
예제 #7
0
        /// <summary>
        ///     Returns the default name that would be used for this index.
        /// </summary>
        /// <param name="index"> The index. </param>
        /// <returns> The default name that would be used for this index. </returns>
        public static string GetDefaultName([NotNull] this IIndex index)
        {
            var tableName = index.DeclaringEntityType.GetTableName();
            var schema    = index.DeclaringEntityType.GetSchema();
            var baseName  = new StringBuilder()
                            .Append("IX_")
                            .Append(tableName)
                            .Append("_")
                            .AppendJoin(index.Properties.Select(p => p.GetColumnName(tableName, schema)), "_")
                            .ToString();

            return(Uniquifier.Truncate(baseName, index.DeclaringEntityType.Model.GetMaxIdentifierLength()));
        }
예제 #8
0
        /// <summary>
        ///     Returns the default constraint name that would be used for this foreign key.
        /// </summary>
        /// <param name="foreignKey"> The foreign key. </param>
        /// <returns> The default constraint name that would be used for this foreign key. </returns>
        public static string GetDefaultName([NotNull] this IForeignKey foreignKey)
        {
            var baseName = new StringBuilder()
                           .Append("FK_")
                           .Append(foreignKey.DeclaringEntityType.GetTableName())
                           .Append("_")
                           .Append(foreignKey.PrincipalEntityType.GetTableName())
                           .Append("_")
                           .AppendJoin(foreignKey.Properties.Select(p => p.GetColumnName()), "_")
                           .ToString();

            return(Uniquifier.Truncate(baseName, foreignKey.DeclaringEntityType.Model.GetMaxIdentifierLength()));
        }
예제 #9
0
        private static string GetDefaultName(IMutableForeignKey key)
        {
            var baseName = new StringBuilder()
                           .Append(key.DeclaringEntityType.GetTableName())
                           .Append("_")
                           .Append(key.PrincipalEntityType.GetTableName())
                           .Append("_")
                           .AppendJoin("_", key.PrincipalKey.Properties.Select(p => p.GetColumnName()))
                           .Append("_fkey")
                           .ToString();

            return(Uniquifier.Truncate(baseName, key.DeclaringEntityType.Model.GetMaxIdentifierLength()));
        }
예제 #10
0
        /// <summary>
        ///     Returns the default table name that would be used for this entity type.
        /// </summary>
        /// <param name="entityType"> The entity type to get the table name for. </param>
        /// <returns> The default name of the table to which the entity type would be mapped. </returns>
        public static string GetDefaultTableName([NotNull] this IEntityType entityType)
        {
            var ownership = entityType.FindOwnership();

            if (ownership != null &&
                ownership.IsUnique)
            {
                return(ownership.PrincipalEntityType.GetTableName());
            }

            return(Uniquifier.Truncate(
                       entityType.HasDefiningNavigation()
                    ? $"{entityType.DefiningEntityType.GetTableName()}_{entityType.DefiningNavigationName}"
                    : entityType.ShortName(),
                       entityType.Model.GetMaxIdentifierLength()));
        }
        /// <summary>
        ///     Returns the default constraint name that would be used for this foreign key.
        /// </summary>
        /// <param name="foreignKey"> The foreign key. </param>
        /// <param name="tableName"> The table name. </param>
        /// <param name="schema"> The schema. </param>
        /// <param name="principalTableName"> The principal table name. </param>
        /// <param name="principalSchema"> The principal schema. </param>
        /// <returns> The default constraint name that would be used for this foreign key. </returns>
        public static string GetDefaultName(
            [NotNull] this IForeignKey foreignKey,
            [NotNull] string tableName,
            [CanBeNull] string schema,
            [NotNull] string principalTableName,
            [CanBeNull] string principalSchema)
        {
            var storeObject            = StoreObjectIdentifier.Table(tableName, schema);
            var propertyNames          = foreignKey.Properties.Select(p => p.GetColumnName(storeObject)).ToList();
            var principalPropertyNames = foreignKey.PrincipalKey.Properties.Select(p => p.GetColumnName(storeObject)).ToList();
            var rootForeignKey         = foreignKey;

            // Limit traversal to avoid getting stuck in a cycle (validation will throw for these later)
            // Using a hashset is detrimental to the perf when there are no cycles
            for (var i = 0; i < Metadata.Internal.RelationalEntityTypeExtensions.MaxEntityTypesSharingTable; i++)
            {
                var linkedForeignKey = rootForeignKey.DeclaringEntityType
                                       .FindRowInternalForeignKeys(storeObject)
                                       .SelectMany(fk => fk.PrincipalEntityType.GetForeignKeys())
                                       .FirstOrDefault(k => principalTableName == k.PrincipalEntityType.GetTableName() &&
                                                       principalSchema == k.PrincipalEntityType.GetSchema() &&
                                                       propertyNames.SequenceEqual(k.Properties.Select(p => p.GetColumnName(storeObject))) &&
                                                       principalPropertyNames.SequenceEqual(k.PrincipalKey.Properties.Select(p => p.GetColumnName(storeObject))));
                if (linkedForeignKey == null)
                {
                    break;
                }

                rootForeignKey = linkedForeignKey;
            }

            if (rootForeignKey != foreignKey)
            {
                return(rootForeignKey.GetConstraintName(tableName, schema, principalTableName, principalSchema));
            }

            var baseName = new StringBuilder()
                           .Append("FK_")
                           .Append(tableName)
                           .Append("_")
                           .Append(principalTableName)
                           .Append("_")
                           .AppendJoin(foreignKey.Properties.Select(p => p.GetColumnName(storeObject)), "_")
                           .ToString();

            return(Uniquifier.Truncate(baseName, foreignKey.DeclaringEntityType.Model.GetMaxIdentifierLength()));
        }
예제 #12
0
        /// <summary>
        ///     Returns the default key constraint name that would be used for this key.
        /// </summary>
        /// <param name="key"> The key. </param>
        /// <returns> The default key constraint name that would be used for this key. </returns>
        public static string GetDefaultName([NotNull] this IKey key)
        {
            string name      = null;
            var    tableName = key.DeclaringEntityType.GetTableName();

            if (key.IsPrimaryKey())
            {
                name = "PK_" + tableName;
            }
            else
            {
                name = new StringBuilder()
                       .Append("AK_")
                       .Append(tableName)
                       .Append("_")
                       .AppendJoin(key.Properties.Select(p => p.GetColumnName()), "_")
                       .ToString();
            }

            return(Uniquifier.Truncate(name, key.DeclaringEntityType.Model.GetMaxIdentifierLength()));
        }
        /// <summary>
        ///     Returns the default table name that would be used for this entity type.
        /// </summary>
        /// <param name="entityType"> The entity type to get the table name for. </param>
        /// <param name="truncate"> A value indicating whether the name should be truncated to the max identifier length. </param>
        /// <returns> The default name of the table to which the entity type would be mapped. </returns>
        public static string GetDefaultTableName([NotNull] this IEntityType entityType, bool truncate = true)
        {
            var ownership = entityType.FindOwnership();

            if (ownership != null &&
                ownership.IsUnique)
            {
                return(ownership.PrincipalEntityType.GetTableName());
            }

            var name = entityType.ShortName();

            if (entityType.HasDefiningNavigation())
            {
                var definingTypeName = entityType.DefiningEntityType.GetTableName();
                name = definingTypeName != null
                    ? $"{definingTypeName}_{entityType.DefiningNavigationName}"
                    : $"{entityType.DefiningNavigationName}_{name}";
            }

            return(truncate
                ? Uniquifier.Truncate(name, entityType.Model.GetMaxIdentifierLength())
                : name);
        }
예제 #14
0
        /// <summary>
        ///     Returns the default key constraint name that would be used for this key for a particular table.
        /// </summary>
        /// <param name="key"> The key. </param>
        /// <param name="storeObject"> The identifier of the containing store object. </param>
        /// <returns> The default key constraint name that would be used for this key. </returns>
        public static string GetDefaultName([NotNull] this IKey key, StoreObjectIdentifier storeObject)
        {
            string name = null;

            if (key.IsPrimaryKey())
            {
                var rootKey = key;
                // Limit traversal to avoid getting stuck in a cycle (validation will throw for these later)
                // Using a hashset is detrimental to the perf when there are no cycles
                for (var i = 0; i < Metadata.Internal.RelationalEntityTypeExtensions.MaxEntityTypesSharingTable; i++)
                {
                    var linkingFk = rootKey.DeclaringEntityType.FindRowInternalForeignKeys(storeObject)
                                    .FirstOrDefault();
                    if (linkingFk == null)
                    {
                        break;
                    }

                    rootKey = linkingFk.PrincipalEntityType.FindPrimaryKey();
                }

                if (rootKey != null &&
                    rootKey != key)
                {
                    return(rootKey.GetName(storeObject));
                }

                name = "PK_" + storeObject.Name;
            }
            else
            {
                var propertyNames = key.Properties.Select(p => p.GetColumnName(storeObject)).ToList();
                var rootKey       = key;

                // Limit traversal to avoid getting stuck in a cycle (validation will throw for these later)
                // Using a hashset is detrimental to the perf when there are no cycles
                for (var i = 0; i < Metadata.Internal.RelationalEntityTypeExtensions.MaxEntityTypesSharingTable; i++)
                {
                    var linkedKey = rootKey.DeclaringEntityType
                                    .FindRowInternalForeignKeys(storeObject)
                                    .SelectMany(fk => fk.PrincipalEntityType.GetKeys())
                                    .FirstOrDefault(k => k.Properties.Select(p => p.GetColumnName(storeObject)).SequenceEqual(propertyNames));
                    if (linkedKey == null)
                    {
                        break;
                    }

                    rootKey = linkedKey;
                }

                if (rootKey != key)
                {
                    return(rootKey.GetName(storeObject));
                }

                name = new StringBuilder()
                       .Append("AK_")
                       .Append(storeObject.Name)
                       .Append("_")
                       .AppendJoin(key.Properties.Select(p => p.GetColumnName(storeObject)), "_")
                       .ToString();
            }

            return(Uniquifier.Truncate(name, key.DeclaringEntityType.Model.GetMaxIdentifierLength()));
        }