/// <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 Index CreateIndex(
            [NotNull] IReadOnlyList <Property> properties, bool unique, [NotNull] InternalEntityTypeBuilder entityTypeBuilder)
        {
            foreach (var key in entityTypeBuilder.Metadata.GetKeys())
            {
                if (AreIndexedBy(properties, unique, key.Properties, coveringIndexUniqueness: 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, ConfigurationSource.Convention);

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

            return(indexBuilder?.Metadata);
        }
Exemplo n.º 2
0
        /// <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>
        public virtual InternalIndexBuilder Attach([NotNull] InternalEntityTypeBuilder entityTypeBuilder)
        {
            var properties = entityTypeBuilder.GetActualProperties(Metadata.Properties, null);

            if (properties == null)
            {
                return(null);
            }

            var newIndexBuilder = Metadata.Name == null
                ? entityTypeBuilder.HasIndex(properties, Metadata.GetConfigurationSource())
                : entityTypeBuilder.HasIndex(properties, Metadata.Name, Metadata.GetConfigurationSource());

            newIndexBuilder?.MergeAnnotationsFrom(Metadata);

            var isUniqueConfigurationSource = Metadata.GetIsUniqueConfigurationSource();

            if (isUniqueConfigurationSource.HasValue)
            {
                newIndexBuilder?.IsUnique(Metadata.IsUnique, isUniqueConfigurationSource.Value);
            }

            return(newIndexBuilder);
        }