Ejemplo n.º 1
0
        /// <summary>
        ///     Returns a hash code created from any options that would cause a new <see cref="IServiceProvider" />
        ///     to be needed.
        /// </summary>
        /// <returns> A hash over options that require a new service provider when changed. </returns>
        public virtual long GetServiceProviderHashCode()
        {
            if (_serviceProviderHash == null)
            {
                var hashCode = GetLoggerFactory()?.GetHashCode() ?? 0L;
                hashCode = (hashCode * 397) ^ (GetMemoryCache()?.GetHashCode() ?? 0L);
                hashCode = (hashCode * 3) ^ _sensitiveDataLoggingEnabled.GetHashCode();
                hashCode = (hashCode * 3) ^ _detailedErrorsEnabled.GetHashCode();
                hashCode = (hashCode * 1073742113) ^ _warningsConfiguration.GetServiceProviderHashCode();

                if (_replacedServices != null)
                {
                    hashCode = _replacedServices.Aggregate(hashCode, (t, e) => (t * 397) ^ e.Value.GetHashCode());
                }

                _serviceProviderHash = hashCode;
            }

            return(_serviceProviderHash.Value);
        }
        /// <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 void Validate(IDbContextOptions options)
        {
            var coreOptions = options.FindExtension <CoreOptionsExtension>() ?? new CoreOptionsExtension();

            if (IsSensitiveDataLoggingEnabled != coreOptions.IsSensitiveDataLoggingEnabled)
            {
                Check.DebugAssert(coreOptions.InternalServiceProvider != null, "InternalServiceProvider is null");

                throw new InvalidOperationException(
                          CoreStrings.SingletonOptionChanged(
                              nameof(DbContextOptionsBuilder.EnableSensitiveDataLogging),
                              nameof(DbContextOptionsBuilder.UseInternalServiceProvider)));
            }

            if (WarningsConfiguration?.GetServiceProviderHashCode() != coreOptions.WarningsConfiguration?.GetServiceProviderHashCode())
            {
                Check.DebugAssert(coreOptions.InternalServiceProvider != null, "InternalServiceProvider is null");

                throw new InvalidOperationException(
                          CoreStrings.SingletonOptionChanged(
                              nameof(DbContextOptionsBuilder.ConfigureWarnings),
                              nameof(DbContextOptionsBuilder.UseInternalServiceProvider)));
            }
        }