/// <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 bool Apply(InternalEntityTypeBuilder entityTypeBuilder, EntityType oldBaseType)
        {
            if (oldBaseType != null &&
                oldBaseType.BaseType == null &&
                oldBaseType.GetDirectlyDerivedTypes().Count == 0)
            {
                ((IConventionEntityTypeBuilder)oldBaseType.Builder)?.HasNoDeclaredDiscriminator();
            }

            IConventionEntityTypeBuilder conventionEntityTypeBuilder = entityTypeBuilder;
            var entityType         = entityTypeBuilder.Metadata;
            var derivedEntityTypes = entityType.GetDerivedTypes().ToList();

            IConventionDiscriminatorBuilder discriminator;

            if (entityType.BaseType == null)
            {
                if (derivedEntityTypes.Count == 0)
                {
                    conventionEntityTypeBuilder.HasNoDeclaredDiscriminator();
                    return(true);
                }

                discriminator = conventionEntityTypeBuilder.HasDiscriminator(typeof(string));
            }
            else
            {
                if (conventionEntityTypeBuilder.HasNoDeclaredDiscriminator() == null)
                {
                    return(true);
                }

                IConventionEntityTypeBuilder rootTypeBuilder = entityType.RootType().Builder;
                discriminator = rootTypeBuilder?.HasDiscriminator(typeof(string));

                if (entityType.BaseType.BaseType == null)
                {
                    discriminator?.HasValue(entityType.BaseType, entityType.BaseType.ShortName());
                }
            }

            if (discriminator != null)
            {
                discriminator.HasValue(entityTypeBuilder.Metadata, entityTypeBuilder.Metadata.ShortName());
                SetDefaultDiscriminatorValues(derivedEntityTypes, discriminator);
            }

            return(true);
        }