/// <summary>
        ///     This is an internal API that supports the Entity Framework Core infrastructure and not subject to
        ///     the same compatibility standards as public APIs. It may be changed or removed without notice in
        ///     any release. You should only use it directly in your code with extreme caution and knowing that
        ///     doing so can result in application failures when updating to a new Entity Framework Core release.
        /// </summary>
        protected virtual IConventionIndex CreateIndex(
            [NotNull] IReadOnlyList <IConventionProperty> properties, bool unique, [NotNull] IConventionEntityTypeBuilder entityTypeBuilder)
        {
            foreach (var key in entityTypeBuilder.Metadata.GetKeys())
            {
                if (AreIndexedBy(properties, unique, key.Properties, coveringIndexUnique: true))
                {
                    return(null);
                }
            }

            foreach (var existingIndex in entityTypeBuilder.Metadata.GetIndexes())
            {
                if (AreIndexedBy(properties, unique, existingIndex.Properties, existingIndex.IsUnique))
                {
                    return(null);
                }
            }

            var indexBuilder = entityTypeBuilder.HasIndex(properties);

            if (unique)
            {
                indexBuilder?.IsUnique(true);
            }

            return(indexBuilder?.Metadata);
        }