/// <summary>
        ///     This API supports the Entity Framework Core infrastructure and is not intended to be used
        ///     directly from your code. This API may change or be removed in future releases.
        /// </summary>
        public virtual Expression CreateMaterializeExpression(
            IEntityType entityType,
            Expression valueBufferExpression,
            int[] indexMap = null)
        {
            // ReSharper disable once SuspiciousTypeConversion.Global
            var materializer = entityType as IEntityMaterializer;

            if (materializer != null)
            {
                return(Expression.Call(
                           Expression.Constant(materializer),
                           ((Func <ValueBuffer, object>)materializer.CreateEntity).GetMethodInfo(),
                           valueBufferExpression));
            }

            if (!entityType.HasClrType())
            {
                throw new InvalidOperationException(CoreStrings.NoClrType(entityType.Name));
            }

            if (entityType.IsAbstract())
            {
                throw new InvalidOperationException(CoreStrings.CannotMaterializeAbstractType(entityType));
            }

            var constructorInfo = entityType.ClrType.GetDeclaredConstructor(null);

            if (constructorInfo == null)
            {
                throw new InvalidOperationException(CoreStrings.NoParameterlessConstructor(entityType.DisplayName()));
            }

            var instanceVariable = Expression.Variable(entityType.ClrType, "instance");

            var blockExpressions
                = new List <Expression>
                {
                Expression.Assign(
                    instanceVariable,
                    Expression.New(constructorInfo))
                };

            blockExpressions.AddRange(
                from mapping in _memberMapper.MapPropertiesToMembers(entityType)
                let propertyInfo = mapping.Item2 as PropertyInfo
                                   let targetMember
                                       = propertyInfo != null
                        ? Expression.Property(instanceVariable, propertyInfo)
                        : Expression.Field(instanceVariable, (FieldInfo)mapping.Item2)
                                         select
                                         Expression.Assign(
                                             targetMember,
                                             CreateReadValueExpression(
                                                 valueBufferExpression,
                                                 targetMember.Type,
                                                 indexMap?[mapping.Item1.GetIndex()] ?? mapping.Item1.GetIndex())));

            blockExpressions.Add(instanceVariable);

            return(Expression.Block(new[] { instanceVariable }, blockExpressions));
        }
 /// <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 override QueryRootExpression UpdateEntityType(IEntityType entityType)
 => entityType.ClrType != EntityType.ClrType ||
 entityType.Name != EntityType.Name
             ? throw new InvalidOperationException(CoreStrings.QueryRootDifferentEntityType(entityType.DisplayName()))
             : new TemporalContainedInQueryRootExpression(entityType, From, To);
예제 #3
0
 /// <summary>
 ///     Creates a copy of this mapping.
 /// </summary>
 /// <param name="parameters"> The parameters for this mapping. </param>
 /// <returns> The newly created mapping. </returns>
 protected virtual RelationalTypeMapping Clone(RelationalTypeMappingParameters parameters)
 => throw new NotImplementedException(CoreStrings.ConverterCloneNotImplemented(GetType().ShortDisplayName()));
예제 #4
0
        public void BatchingTopologicalSort_throws_with_formatted_message_with_no_tail_when_cycle_cannot_be_broken()
        {
            const string message = "Formatted cycle";

            var vertexOne = new Vertex
            {
                Id = 1
            };
            var vertexTwo = new Vertex
            {
                Id = 2
            };
            var vertexThree = new Vertex
            {
                Id = 3
            };
            var vertexFour = new Vertex
            {
                Id = 4
            };

            var edgeOne = new Edge
            {
                Id = 1
            };
            var edgeTwo = new Edge
            {
                Id = 2
            };
            var edgeThree = new Edge
            {
                Id = 3
            };
            var edgeFour = new Edge
            {
                Id = 4
            };

            var graph = new Multigraph <Vertex, Edge>();

            graph.AddVertices(new[] { vertexOne, vertexTwo, vertexThree, vertexFour });

            // 2 -> {1}
            graph.AddEdge(vertexTwo, vertexOne, edgeOne);
            // 3 -> {2}
            graph.AddEdge(vertexThree, vertexTwo, edgeTwo);
            // 4 -> {3}
            graph.AddEdge(vertexFour, vertexThree, edgeThree);
            // 3 -> {4}
            graph.AddEdge(vertexThree, vertexFour, edgeFour);

            Dictionary <Vertex, Tuple <Vertex, Vertex, IEnumerable <Edge> > > cycleData = null;

            string formatter(IEnumerable <Tuple <Vertex, Vertex, IEnumerable <Edge> > > data)
            {
                cycleData = data.ToDictionary(entry => entry.Item1);
                return(message);
            }

            Assert.Equal(
                CoreStrings.CircularDependency(message),
                Assert.Throws <InvalidOperationException>(() => graph.BatchingTopologicalSort(formatter)).Message);

            Assert.Equal(2, cycleData.Count);

            Assert.Equal(vertexFour, cycleData[vertexThree].Item2);
            Assert.Equal(new[] { edgeFour }, cycleData[vertexThree].Item3);

            Assert.Equal(vertexThree, cycleData[vertexFour].Item2);
            Assert.Equal(new[] { edgeThree }, cycleData[vertexFour].Item3);
        }
예제 #5
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 IComparer <IUpdateEntry> Create([NotNull] IPropertyBase propertyBase)
        {
            var modelType            = propertyBase.ClrType;
            var nonNullableModelType = modelType.UnwrapNullableType();

            if (IsGenericComparable(modelType, nonNullableModelType))
            {
                return((IComparer <IUpdateEntry>)Activator.CreateInstance(
                           typeof(EntryCurrentValueComparer <>).MakeGenericType(modelType),
                           propertyBase));
            }

            if (typeof(IStructuralComparable).IsAssignableFrom(nonNullableModelType))
            {
                return(new StructuralEntryCurrentValueComparer(propertyBase));
            }

            if (typeof(IComparable).IsAssignableFrom(nonNullableModelType))
            {
                return(new EntryCurrentValueComparer(propertyBase));
            }

            if (propertyBase is IProperty property)
            {
                var converter = property.GetValueConverter()
                                ?? property.GetTypeMapping().Converter;

                if (converter != null)
                {
                    var providerType            = converter.ProviderClrType;
                    var nonNullableProviderType = providerType.UnwrapNullableType();
                    if (IsGenericComparable(providerType, nonNullableProviderType))
                    {
                        var comparerType = modelType.IsClass
                            ? typeof(NullableClassCurrentProviderValueComparer <,>).MakeGenericType(modelType, converter.ProviderClrType)
                            : modelType == converter.ModelClrType
                                ? typeof(CurrentProviderValueComparer <,>).MakeGenericType(modelType, converter.ProviderClrType)
                                : typeof(NullableStructCurrentProviderValueComparer <,>).MakeGenericType(
                            nonNullableModelType, converter.ProviderClrType);

                        return((IComparer <IUpdateEntry>)Activator.CreateInstance(comparerType, propertyBase, converter));
                    }

                    if (typeof(IStructuralComparable).IsAssignableFrom(nonNullableProviderType))
                    {
                        return(new StructuralEntryCurrentProviderValueComparer(propertyBase, converter));
                    }

                    if (typeof(IComparable).IsAssignableFrom(nonNullableProviderType))
                    {
                        return(new EntryCurrentProviderValueComparer(propertyBase, converter));
                    }

                    throw new InvalidOperationException(
                              CoreStrings.NonComparableKeyTypes(
                                  propertyBase.DeclaringType.DisplayName(),
                                  propertyBase.Name,
                                  modelType.ShortDisplayName(),
                                  providerType.ShortDisplayName()));
                }
            }

            throw new InvalidOperationException(
                      CoreStrings.NonComparableKeyType(
                          propertyBase.DeclaringType.DisplayName(),
                          propertyBase.Name,
                          modelType.ShortDisplayName()));

            bool IsGenericComparable(Type type, Type nonNullableType)
            => typeof(IComparable <>).MakeGenericType(type).IsAssignableFrom(type) ||
            typeof(IComparable <>).MakeGenericType(nonNullableType).IsAssignableFrom(nonNullableType) ||
            type.IsEnum ||
            nonNullableType.IsEnum;
        }
예제 #6
0
        public void Can_find_targets_for_same_base_foreign_keys()
        {
            var fk = CreateOneToManySameBaseFK();

            var model            = fk.DeclaringEntityType.Model;
            var derivedPrincipal = model.AddEntityType(typeof(DerivedOneToManyPrincipal));

            derivedPrincipal.BaseType = fk.PrincipalEntityType;

            var derivedDependent = model.AddEntityType(typeof(DerivedOneToManyDependent));

            derivedDependent.BaseType = fk.DeclaringEntityType;

            Assert.Same(fk.PrincipalEntityType, fk.ResolveOtherEntityType(fk.DeclaringEntityType));
            Assert.Same(fk.DeclaringEntityType, fk.ResolveOtherEntityType(fk.PrincipalEntityType));
            Assert.Same(fk.PrincipalToDependent, fk.FindNavigationsFrom(fk.PrincipalEntityType).SingleOrDefault());
            Assert.Same(fk.DependentToPrincipal, fk.FindNavigationsFrom(fk.DeclaringEntityType).SingleOrDefault());
            Assert.Same(fk.DependentToPrincipal, fk.FindNavigationsTo(fk.PrincipalEntityType).SingleOrDefault());
            Assert.Same(fk.PrincipalToDependent, fk.FindNavigationsTo(fk.DeclaringEntityType).SingleOrDefault());

            Assert.Same(fk.DeclaringEntityType, fk.ResolveEntityTypeInHierarchy(fk.DeclaringEntityType));
            Assert.Same(fk.PrincipalEntityType, fk.ResolveEntityTypeInHierarchy(fk.PrincipalEntityType));
            Assert.Same(fk.PrincipalEntityType, fk.ResolveOtherEntityTypeInHierarchy(fk.DeclaringEntityType));
            Assert.Same(fk.DeclaringEntityType, fk.ResolveOtherEntityTypeInHierarchy(fk.PrincipalEntityType));
            Assert.Same(fk.PrincipalToDependent, fk.FindNavigationsFromInHierarchy(fk.PrincipalEntityType).SingleOrDefault());
            Assert.Same(fk.DependentToPrincipal, fk.FindNavigationsFromInHierarchy(fk.DeclaringEntityType).SingleOrDefault());
            Assert.Same(fk.DependentToPrincipal, fk.FindNavigationsToInHierarchy(fk.PrincipalEntityType).SingleOrDefault());
            Assert.Same(fk.PrincipalToDependent, fk.FindNavigationsToInHierarchy(fk.DeclaringEntityType).SingleOrDefault());

            Assert.Equal(
                CoreStrings.EntityTypeNotInRelationshipStrict(
                    derivedDependent.DisplayName(), fk.DeclaringEntityType.DisplayName(), fk.PrincipalEntityType.DisplayName()),
                Assert.Throws <InvalidOperationException>(() => fk.ResolveOtherEntityType(derivedDependent)).Message);
            Assert.Equal(
                CoreStrings.EntityTypeNotInRelationshipStrict(
                    derivedPrincipal.DisplayName(), fk.DeclaringEntityType.DisplayName(), fk.PrincipalEntityType.DisplayName()),
                Assert.Throws <InvalidOperationException>(() => fk.ResolveOtherEntityType(derivedPrincipal)).Message);
            Assert.Equal(
                CoreStrings.EntityTypeNotInRelationshipStrict(
                    derivedPrincipal.DisplayName(), fk.DeclaringEntityType.DisplayName(), fk.PrincipalEntityType.DisplayName()),
                Assert.Throws <InvalidOperationException>(() => fk.FindNavigationsFrom(derivedPrincipal)).Message);
            Assert.Equal(
                CoreStrings.EntityTypeNotInRelationshipStrict(
                    derivedDependent.DisplayName(), fk.DeclaringEntityType.DisplayName(), fk.PrincipalEntityType.DisplayName()),
                Assert.Throws <InvalidOperationException>(() => fk.FindNavigationsFrom(derivedDependent)).Message);
            Assert.Equal(
                CoreStrings.EntityTypeNotInRelationshipStrict(
                    derivedPrincipal.DisplayName(), fk.DeclaringEntityType.DisplayName(), fk.PrincipalEntityType.DisplayName()),
                Assert.Throws <InvalidOperationException>(() => fk.FindNavigationsTo(derivedPrincipal)).Message);
            Assert.Equal(
                CoreStrings.EntityTypeNotInRelationshipStrict(
                    derivedDependent.DisplayName(), fk.DeclaringEntityType.DisplayName(), fk.PrincipalEntityType.DisplayName()),
                Assert.Throws <InvalidOperationException>(() => fk.FindNavigationsTo(derivedDependent)).Message);

            Assert.Same(fk.DeclaringEntityType, fk.ResolveEntityTypeInHierarchy(derivedDependent));
            Assert.Same(fk.PrincipalEntityType, fk.ResolveEntityTypeInHierarchy(derivedPrincipal));
            Assert.Same(fk.PrincipalEntityType, fk.ResolveOtherEntityTypeInHierarchy(derivedDependent));
            Assert.Same(fk.DeclaringEntityType, fk.ResolveOtherEntityTypeInHierarchy(derivedPrincipal));
            Assert.Equal(new[] { fk.PrincipalToDependent }.Where(n => n != null), fk.FindNavigationsFromInHierarchy(derivedPrincipal));
            Assert.Equal(new[] { fk.DependentToPrincipal }.Where(n => n != null), fk.FindNavigationsFromInHierarchy(derivedDependent));
            Assert.Equal(new[] { fk.DependentToPrincipal }.Where(n => n != null), fk.FindNavigationsToInHierarchy(derivedPrincipal));
            Assert.Equal(new[] { fk.PrincipalToDependent }.Where(n => n != null), fk.FindNavigationsToInHierarchy(derivedDependent));
        }
        protected override Expression VisitMethodCall(MethodCallExpression methodCallExpression)
        {
            Check.NotNull(methodCallExpression, nameof(methodCallExpression));

            ShapedQueryExpression CheckTranslated(ShapedQueryExpression translated)
            {
                return translated ?? throw new InvalidOperationException(CoreStrings.TranslationFailed(methodCallExpression.Print()));
            }

            var method = methodCallExpression.Method;
            if (method.DeclaringType == typeof(Queryable)
                || method.DeclaringType == typeof(QueryableExtensions))
            {
                var source = Visit(methodCallExpression.Arguments[0]);
                if (source is ShapedQueryExpression shapedQueryExpression)
                {
                    var genericMethod = method.IsGenericMethod ? method.GetGenericMethodDefinition() : null;
                    switch (method.Name)
                    {
                        case nameof(Queryable.All)
                            when genericMethod == QueryableMethods.All:
                            shapedQueryExpression = shapedQueryExpression.UpdateResultCardinality(ResultCardinality.Single);
                            return CheckTranslated(TranslateAll(shapedQueryExpression, GetLambdaExpressionFromArgument(1)));

                        case nameof(Queryable.Any)
                            when genericMethod == QueryableMethods.AnyWithoutPredicate:
                            shapedQueryExpression = shapedQueryExpression.UpdateResultCardinality(ResultCardinality.Single);
                            return CheckTranslated(TranslateAny(shapedQueryExpression, null));

                        case nameof(Queryable.Any)
                            when genericMethod == QueryableMethods.AnyWithPredicate:
                            shapedQueryExpression = shapedQueryExpression.UpdateResultCardinality(ResultCardinality.Single);
                            return CheckTranslated(TranslateAny(shapedQueryExpression, GetLambdaExpressionFromArgument(1)));

                        case nameof(Queryable.AsQueryable)
                            when genericMethod == QueryableMethods.AsQueryable:
                            return source;

                        case nameof(Queryable.Average)
                            when QueryableMethods.IsAverageWithoutSelector(method):
                            shapedQueryExpression = shapedQueryExpression.UpdateResultCardinality(ResultCardinality.Single);
                            return CheckTranslated(TranslateAverage(shapedQueryExpression, null, methodCallExpression.Type));

                        case nameof(Queryable.Average)
                            when QueryableMethods.IsAverageWithSelector(method):
                            shapedQueryExpression = shapedQueryExpression.UpdateResultCardinality(ResultCardinality.Single);
                            return CheckTranslated(
                                TranslateAverage(shapedQueryExpression, GetLambdaExpressionFromArgument(1), methodCallExpression.Type));

                        case nameof(Queryable.Cast)
                            when genericMethod == QueryableMethods.Cast:
                            return CheckTranslated(TranslateCast(shapedQueryExpression, method.GetGenericArguments()[0]));

                        case nameof(Queryable.Concat)
                            when genericMethod == QueryableMethods.Concat:
                        {
                            var source2 = Visit(methodCallExpression.Arguments[1]);
                            if (source2 is ShapedQueryExpression innerShapedQueryExpression)
                            {
                                return TranslateConcat(
                                    shapedQueryExpression,
                                    innerShapedQueryExpression);
                            }

                            break;
                        }

                        case nameof(Queryable.Contains)
                            when genericMethod == QueryableMethods.Contains:
                            shapedQueryExpression = shapedQueryExpression.UpdateResultCardinality(ResultCardinality.Single);
                            return CheckTranslated(TranslateContains(shapedQueryExpression, methodCallExpression.Arguments[1]));

                        case nameof(Queryable.Count)
                            when genericMethod == QueryableMethods.CountWithoutPredicate:
                            shapedQueryExpression = shapedQueryExpression.UpdateResultCardinality(ResultCardinality.Single);
                            return CheckTranslated(TranslateCount(shapedQueryExpression, null));

                        case nameof(Queryable.Count)
                            when genericMethod == QueryableMethods.CountWithPredicate:
                            shapedQueryExpression = shapedQueryExpression.UpdateResultCardinality(ResultCardinality.Single);
                            return CheckTranslated(TranslateCount(shapedQueryExpression, GetLambdaExpressionFromArgument(1)));

                        case nameof(Queryable.DefaultIfEmpty)
                            when genericMethod == QueryableMethods.DefaultIfEmptyWithoutArgument:
                            return CheckTranslated(TranslateDefaultIfEmpty(shapedQueryExpression, null));

                        case nameof(Queryable.DefaultIfEmpty)
                            when genericMethod == QueryableMethods.DefaultIfEmptyWithArgument:
                            return CheckTranslated(TranslateDefaultIfEmpty(shapedQueryExpression, methodCallExpression.Arguments[1]));

                        case nameof(Queryable.Distinct)
                            when genericMethod == QueryableMethods.Distinct:
                            return CheckTranslated(TranslateDistinct(shapedQueryExpression));

                        case nameof(Queryable.ElementAt)
                            when genericMethod == QueryableMethods.ElementAt:
                            shapedQueryExpression = shapedQueryExpression.UpdateResultCardinality(ResultCardinality.Single);
                            return CheckTranslated(
                                TranslateElementAtOrDefault(shapedQueryExpression, methodCallExpression.Arguments[1], false));

                        case nameof(Queryable.ElementAtOrDefault)
                            when genericMethod == QueryableMethods.ElementAtOrDefault:
                            shapedQueryExpression = shapedQueryExpression.UpdateResultCardinality(ResultCardinality.SingleOrDefault);
                            return CheckTranslated(
                                TranslateElementAtOrDefault(shapedQueryExpression, methodCallExpression.Arguments[1], true));

                        case nameof(Queryable.Except)
                            when genericMethod == QueryableMethods.Except:
                        {
                            var source2 = Visit(methodCallExpression.Arguments[1]);
                            if (source2 is ShapedQueryExpression innerShapedQueryExpression)
                            {
                                return CheckTranslated(
                                    TranslateExcept(
                                        shapedQueryExpression,
                                        innerShapedQueryExpression));
                            }

                            break;
                        }

                        case nameof(Queryable.First)
                            when genericMethod == QueryableMethods.FirstWithoutPredicate:
                            shapedQueryExpression = shapedQueryExpression.UpdateResultCardinality(ResultCardinality.Single);
                            return CheckTranslated(TranslateFirstOrDefault(shapedQueryExpression, null, methodCallExpression.Type, false));

                        case nameof(Queryable.First)
                            when genericMethod == QueryableMethods.FirstWithPredicate:
                            shapedQueryExpression = shapedQueryExpression.UpdateResultCardinality(ResultCardinality.Single);
                            return CheckTranslated(
                                TranslateFirstOrDefault(
                                    shapedQueryExpression, GetLambdaExpressionFromArgument(1), methodCallExpression.Type, false));

                        case nameof(Queryable.FirstOrDefault)
                            when genericMethod == QueryableMethods.FirstOrDefaultWithoutPredicate:
                            shapedQueryExpression = shapedQueryExpression.UpdateResultCardinality(ResultCardinality.SingleOrDefault);
                            return CheckTranslated(TranslateFirstOrDefault(shapedQueryExpression, null, methodCallExpression.Type, true));

                        case nameof(Queryable.FirstOrDefault)
                            when genericMethod == QueryableMethods.FirstOrDefaultWithPredicate:
                            shapedQueryExpression = shapedQueryExpression.UpdateResultCardinality(ResultCardinality.SingleOrDefault);
                            return CheckTranslated(
                                TranslateFirstOrDefault(
                                    shapedQueryExpression, GetLambdaExpressionFromArgument(1), methodCallExpression.Type, true));

                        case nameof(Queryable.GroupBy)
                            when genericMethod == QueryableMethods.GroupByWithKeySelector:
                            return CheckTranslated(TranslateGroupBy(shapedQueryExpression, GetLambdaExpressionFromArgument(1), null, null));

                        case nameof(Queryable.GroupBy)
                            when genericMethod == QueryableMethods.GroupByWithKeyElementSelector:
                            return CheckTranslated(
                                TranslateGroupBy(
                                    shapedQueryExpression, GetLambdaExpressionFromArgument(1), GetLambdaExpressionFromArgument(2), null));

                        case nameof(Queryable.GroupBy)
                            when genericMethod == QueryableMethods.GroupByWithKeyElementResultSelector:
                            return CheckTranslated(
                                TranslateGroupBy(
                                    shapedQueryExpression, GetLambdaExpressionFromArgument(1), GetLambdaExpressionFromArgument(2),
                                    GetLambdaExpressionFromArgument(3)));

                        case nameof(Queryable.GroupBy)
                            when genericMethod == QueryableMethods.GroupByWithKeyResultSelector:
                            return CheckTranslated(
                                TranslateGroupBy(
                                    shapedQueryExpression, GetLambdaExpressionFromArgument(1), null, GetLambdaExpressionFromArgument(2)));

                        case nameof(Queryable.GroupJoin)
                            when genericMethod == QueryableMethods.GroupJoin:
                        {
                            if (Visit(methodCallExpression.Arguments[1]) is ShapedQueryExpression innerShapedQueryExpression)
                            {
                                return CheckTranslated(
                                    TranslateGroupJoin(
                                        shapedQueryExpression,
                                        innerShapedQueryExpression,
                                        GetLambdaExpressionFromArgument(2),
                                        GetLambdaExpressionFromArgument(3),
                                        GetLambdaExpressionFromArgument(4)));
                            }

                            break;
                        }

                        case nameof(Queryable.Intersect)
                            when genericMethod == QueryableMethods.Intersect:
                        {
                            if (Visit(methodCallExpression.Arguments[1]) is ShapedQueryExpression innerShapedQueryExpression)
                            {
                                return CheckTranslated(TranslateIntersect(shapedQueryExpression, innerShapedQueryExpression));
                            }

                            break;
                        }

                        case nameof(Queryable.Join)
                            when genericMethod == QueryableMethods.Join:
                        {
                            if (Visit(methodCallExpression.Arguments[1]) is ShapedQueryExpression innerShapedQueryExpression)
                            {
                                return CheckTranslated(
                                    TranslateJoin(
                                        shapedQueryExpression, innerShapedQueryExpression, GetLambdaExpressionFromArgument(2),
                                        GetLambdaExpressionFromArgument(3), GetLambdaExpressionFromArgument(4)));
                            }

                            break;
                        }

                        case nameof(QueryableExtensions.LeftJoin)
                            when genericMethod == QueryableExtensions.LeftJoinMethodInfo:
                        {
                            if (Visit(methodCallExpression.Arguments[1]) is ShapedQueryExpression innerShapedQueryExpression)
                            {
                                return CheckTranslated(
                                    TranslateLeftJoin(
                                        shapedQueryExpression, innerShapedQueryExpression, GetLambdaExpressionFromArgument(2),
                                        GetLambdaExpressionFromArgument(3), GetLambdaExpressionFromArgument(4)));
                            }

                            break;
                        }

                        case nameof(Queryable.Last)
                            when genericMethod == QueryableMethods.LastWithoutPredicate:
                            shapedQueryExpression = shapedQueryExpression.UpdateResultCardinality(ResultCardinality.Single);
                            return CheckTranslated(TranslateLastOrDefault(shapedQueryExpression, null, methodCallExpression.Type, false));

                        case nameof(Queryable.Last)
                            when genericMethod == QueryableMethods.LastWithPredicate:
                            shapedQueryExpression = shapedQueryExpression.UpdateResultCardinality(ResultCardinality.Single);
                            return CheckTranslated(
                                TranslateLastOrDefault(
                                    shapedQueryExpression, GetLambdaExpressionFromArgument(1), methodCallExpression.Type, false));

                        case nameof(Queryable.LastOrDefault)
                            when genericMethod == QueryableMethods.LastOrDefaultWithoutPredicate:
                            shapedQueryExpression = shapedQueryExpression.UpdateResultCardinality(ResultCardinality.SingleOrDefault);
                            return CheckTranslated(TranslateLastOrDefault(shapedQueryExpression, null, methodCallExpression.Type, true));

                        case nameof(Queryable.LastOrDefault)
                            when genericMethod == QueryableMethods.LastOrDefaultWithPredicate:
                            shapedQueryExpression = shapedQueryExpression.UpdateResultCardinality(ResultCardinality.SingleOrDefault);
                            return CheckTranslated(
                                TranslateLastOrDefault(
                                    shapedQueryExpression, GetLambdaExpressionFromArgument(1), methodCallExpression.Type, true));

                        case nameof(Queryable.LongCount)
                            when genericMethod == QueryableMethods.LongCountWithoutPredicate:
                            shapedQueryExpression = shapedQueryExpression.UpdateResultCardinality(ResultCardinality.Single);
                            return CheckTranslated(TranslateLongCount(shapedQueryExpression, null));

                        case nameof(Queryable.LongCount)
                            when genericMethod == QueryableMethods.LongCountWithPredicate:
                            shapedQueryExpression = shapedQueryExpression.UpdateResultCardinality(ResultCardinality.Single);
                            return CheckTranslated(TranslateLongCount(shapedQueryExpression, GetLambdaExpressionFromArgument(1)));

                        case nameof(Queryable.Max)
                            when genericMethod == QueryableMethods.MaxWithoutSelector:
                            shapedQueryExpression = shapedQueryExpression.UpdateResultCardinality(ResultCardinality.Single);
                            return CheckTranslated(TranslateMax(shapedQueryExpression, null, methodCallExpression.Type));

                        case nameof(Queryable.Max)
                            when genericMethod == QueryableMethods.MaxWithSelector:
                            shapedQueryExpression = shapedQueryExpression.UpdateResultCardinality(ResultCardinality.Single);
                            return CheckTranslated(
                                TranslateMax(shapedQueryExpression, GetLambdaExpressionFromArgument(1), methodCallExpression.Type));

                        case nameof(Queryable.Min)
                            when genericMethod == QueryableMethods.MinWithoutSelector:
                            shapedQueryExpression = shapedQueryExpression.UpdateResultCardinality(ResultCardinality.Single);
                            return CheckTranslated(TranslateMin(shapedQueryExpression, null, methodCallExpression.Type));

                        case nameof(Queryable.Min)
                            when genericMethod == QueryableMethods.MinWithSelector:
                            shapedQueryExpression = shapedQueryExpression.UpdateResultCardinality(ResultCardinality.Single);
                            return CheckTranslated(
                                TranslateMin(shapedQueryExpression, GetLambdaExpressionFromArgument(1), methodCallExpression.Type));

                        case nameof(Queryable.OfType)
                            when genericMethod == QueryableMethods.OfType:
                            return CheckTranslated(TranslateOfType(shapedQueryExpression, method.GetGenericArguments()[0]));

                        case nameof(Queryable.OrderBy)
                            when genericMethod == QueryableMethods.OrderBy:
                            return CheckTranslated(TranslateOrderBy(shapedQueryExpression, GetLambdaExpressionFromArgument(1), true));

                        case nameof(Queryable.OrderByDescending)
                            when genericMethod == QueryableMethods.OrderByDescending:
                            return CheckTranslated(TranslateOrderBy(shapedQueryExpression, GetLambdaExpressionFromArgument(1), false));

                        case nameof(Queryable.Reverse)
                            when genericMethod == QueryableMethods.Reverse:
                            return CheckTranslated(TranslateReverse(shapedQueryExpression));

                        case nameof(Queryable.Select)
                            when genericMethod == QueryableMethods.Select:
                            return CheckTranslated(TranslateSelect(shapedQueryExpression, GetLambdaExpressionFromArgument(1)));

                        case nameof(Queryable.SelectMany)
                            when genericMethod == QueryableMethods.SelectManyWithoutCollectionSelector:
                            return CheckTranslated(TranslateSelectMany(shapedQueryExpression, GetLambdaExpressionFromArgument(1)));

                        case nameof(Queryable.SelectMany)
                            when genericMethod == QueryableMethods.SelectManyWithCollectionSelector:
                            return CheckTranslated(
                                TranslateSelectMany(
                                    shapedQueryExpression, GetLambdaExpressionFromArgument(1), GetLambdaExpressionFromArgument(2)));

                        case nameof(Queryable.Single)
                            when genericMethod == QueryableMethods.SingleWithoutPredicate:
                            shapedQueryExpression = shapedQueryExpression.UpdateResultCardinality(ResultCardinality.Single);
                            return CheckTranslated(TranslateSingleOrDefault(shapedQueryExpression, null, methodCallExpression.Type, false));

                        case nameof(Queryable.Single)
                            when genericMethod == QueryableMethods.SingleWithPredicate:
                            shapedQueryExpression = shapedQueryExpression.UpdateResultCardinality(ResultCardinality.Single);
                            return CheckTranslated(
                                TranslateSingleOrDefault(
                                    shapedQueryExpression, GetLambdaExpressionFromArgument(1), methodCallExpression.Type, false));

                        case nameof(Queryable.SingleOrDefault)
                            when genericMethod == QueryableMethods.SingleOrDefaultWithoutPredicate:
                            shapedQueryExpression = shapedQueryExpression.UpdateResultCardinality(ResultCardinality.SingleOrDefault);
                            return CheckTranslated(TranslateSingleOrDefault(shapedQueryExpression, null, methodCallExpression.Type, true));

                        case nameof(Queryable.SingleOrDefault)
                            when genericMethod == QueryableMethods.SingleOrDefaultWithPredicate:
                            shapedQueryExpression = shapedQueryExpression.UpdateResultCardinality(ResultCardinality.SingleOrDefault);
                            return CheckTranslated(
                                TranslateSingleOrDefault(
                                    shapedQueryExpression, GetLambdaExpressionFromArgument(1), methodCallExpression.Type, true));

                        case nameof(Queryable.Skip)
                            when genericMethod == QueryableMethods.Skip:
                            return CheckTranslated(TranslateSkip(shapedQueryExpression, methodCallExpression.Arguments[1]));

                        case nameof(Queryable.SkipWhile)
                            when genericMethod == QueryableMethods.SkipWhile:
                            return CheckTranslated(TranslateSkipWhile(shapedQueryExpression, GetLambdaExpressionFromArgument(1)));

                        case nameof(Queryable.Sum)
                            when QueryableMethods.IsSumWithoutSelector(method):
                            shapedQueryExpression = shapedQueryExpression.UpdateResultCardinality(ResultCardinality.Single);
                            return CheckTranslated(TranslateSum(shapedQueryExpression, null, methodCallExpression.Type));

                        case nameof(Queryable.Sum)
                            when QueryableMethods.IsSumWithSelector(method):
                            shapedQueryExpression = shapedQueryExpression.UpdateResultCardinality(ResultCardinality.Single);
                            return CheckTranslated(
                                TranslateSum(shapedQueryExpression, GetLambdaExpressionFromArgument(1), methodCallExpression.Type));

                        case nameof(Queryable.Take)
                            when genericMethod == QueryableMethods.Take:
                            return CheckTranslated(TranslateTake(shapedQueryExpression, methodCallExpression.Arguments[1]));

                        case nameof(Queryable.TakeWhile)
                            when genericMethod == QueryableMethods.TakeWhile:
                            return CheckTranslated(TranslateTakeWhile(shapedQueryExpression, GetLambdaExpressionFromArgument(1)));

                        case nameof(Queryable.ThenBy)
                            when genericMethod == QueryableMethods.ThenBy:
                            return CheckTranslated(TranslateThenBy(shapedQueryExpression, GetLambdaExpressionFromArgument(1), true));

                        case nameof(Queryable.ThenByDescending)
                            when genericMethod == QueryableMethods.ThenByDescending:
                            return CheckTranslated(TranslateThenBy(shapedQueryExpression, GetLambdaExpressionFromArgument(1), false));

                        case nameof(Queryable.Union)
                            when genericMethod == QueryableMethods.Union:
                        {
                            if (Visit(methodCallExpression.Arguments[1]) is ShapedQueryExpression innerShapedQueryExpression)
                            {
                                return CheckTranslated(TranslateUnion(shapedQueryExpression, innerShapedQueryExpression));
                            }

                            break;
                        }

                        case nameof(Queryable.Where)
                            when genericMethod == QueryableMethods.Where:
                            return CheckTranslated(TranslateWhere(shapedQueryExpression, GetLambdaExpressionFromArgument(1)));

                            LambdaExpression GetLambdaExpressionFromArgument(int argumentIndex) =>
                                methodCallExpression.Arguments[argumentIndex].UnwrapLambdaFromQuote();
                    }
                }
            }

            return _subquery
                ? (Expression)null
                : throw new NotImplementedException(CoreStrings.UnhandledMethod(method.Name));
        }
예제 #8
0
        private bool TryValidatePseudoHeaders()
        {
            // The initial pseudo header validation takes place in Http2Connection.ValidateHeader and StartStream
            // They make sure the right fields are at least present (except for Connect requests) exactly once.

            _httpVersion = Http.HttpVersion.Http2;

            // Method could already have been set from :method static table index
            if (Method == HttpMethod.None && !TryValidateMethod())
            {
                return(false);
            }

            if (!TryValidateAuthorityAndHost(out var hostText))
            {
                return(false);
            }

            // CONNECT - :scheme and :path must be excluded
            if (Method == HttpMethod.Connect)
            {
                if (!String.IsNullOrEmpty(HttpRequestHeaders.HeaderScheme) || !String.IsNullOrEmpty(HttpRequestHeaders.HeaderPath))
                {
                    ResetAndAbort(new ConnectionAbortedException(CoreStrings.Http2ErrorConnectMustNotSendSchemeOrPath), Http2ErrorCode.PROTOCOL_ERROR);
                    return(false);
                }

                RawTarget = hostText;

                return(true);
            }

            // :scheme https://tools.ietf.org/html/rfc7540#section-8.1.2.3
            // ":scheme" is not restricted to "http" and "https" schemed URIs.  A
            // proxy or gateway can translate requests for non - HTTP schemes,
            // enabling the use of HTTP to interact with non - HTTP services.
            // A common example is TLS termination.
            var headerScheme = HttpRequestHeaders.HeaderScheme.ToString();

            HttpRequestHeaders.HeaderScheme = default; // Suppress pseduo headers from the public headers collection.
            if (!ReferenceEquals(headerScheme, Scheme) &&
                !string.Equals(headerScheme, Scheme, StringComparison.OrdinalIgnoreCase))
            {
                if (!ServerOptions.AllowAlternateSchemes || !Uri.CheckSchemeName(headerScheme))
                {
                    ResetAndAbort(new ConnectionAbortedException(
                                      CoreStrings.FormatHttp2StreamErrorSchemeMismatch(headerScheme, Scheme)), Http2ErrorCode.PROTOCOL_ERROR);
                    return(false);
                }

                Scheme = headerScheme;
            }

            // :path (and query) - Required
            // Must start with / except may be * for OPTIONS
            var path = HttpRequestHeaders.HeaderPath.ToString();

            HttpRequestHeaders.HeaderPath = default; // Suppress pseduo headers from the public headers collection.
            RawTarget = path;

            // OPTIONS - https://tools.ietf.org/html/rfc7540#section-8.1.2.3
            // This pseudo-header field MUST NOT be empty for "http" or "https"
            // URIs; "http" or "https" URIs that do not contain a path component
            // MUST include a value of '/'.  The exception to this rule is an
            // OPTIONS request for an "http" or "https" URI that does not include
            // a path component; these MUST include a ":path" pseudo-header field
            // with a value of '*'.
            if (Method == HttpMethod.Options && path.Length == 1 && path[0] == '*')
            {
                // * is stored in RawTarget only since HttpRequest expects Path to be empty or start with a /.
                Path        = string.Empty;
                QueryString = string.Empty;
                return(true);
            }

            // Approximate MaxRequestLineSize by totaling the required pseudo header field lengths.
            var requestLineLength = _methodText !.Length + Scheme !.Length + hostText.Length + path.Length;

            if (requestLineLength > ServerOptions.Limits.MaxRequestLineSize)
            {
                ResetAndAbort(new ConnectionAbortedException(CoreStrings.BadRequest_RequestLineTooLong), Http2ErrorCode.PROTOCOL_ERROR);
                return(false);
            }

            var queryIndex = path.IndexOf('?');

            QueryString = queryIndex == -1 ? string.Empty : path.Substring(queryIndex);

            var pathSegment = queryIndex == -1 ? path.AsSpan() : path.AsSpan(0, queryIndex);

            return(TryValidatePath(pathSegment));
        }
예제 #9
0
        async public override Task <List <T1> > ExecuteDeletedAsync(CancellationToken cancellationToken = default)
        {
            var ret = new List <T1>();

            DbParameter[] dbParms = null;
            StringBuilder sbret   = null;

            await ToSqlFetchAsync(async sb =>
            {
                if (dbParms == null)
                {
                    dbParms = _params.ToArray();
                    sbret   = new StringBuilder();
                    sbret.Append(" OUTPUT ");

                    var colidx = 0;
                    foreach (var col in _table.Columns.Values)
                    {
                        if (colidx > 0)
                        {
                            sbret.Append(", ");
                        }
                        sbret.Append(_commonUtils.RereadColumn(col, $"DELETED.{_commonUtils.QuoteSqlName(col.Attribute.Name)}")).Append(" as ").Append(_commonUtils.QuoteSqlName(col.CsName));
                        ++colidx;
                    }
                }
                var sql    = sb.ToString();
                var validx = sql.IndexOf(" WHERE ");
                if (validx == -1)
                {
                    throw new ArgumentException(CoreStrings.S_NotFound_Name("WHERE"));
                }
                sql = sb.Clear().Append(sql.Substring(0, validx))
                      .Append(sbret)
                      .Append(sql.Substring(validx)).ToString();

                var before = new Aop.CurdBeforeEventArgs(_table.Type, _table, Aop.CurdType.Delete, sql, dbParms);
                _orm.Aop.CurdBeforeHandler?.Invoke(this, before);

                Exception exception = null;
                try
                {
                    ret.AddRange(await _orm.Ado.QueryAsync <T1>(_table.TypeLazy ?? _table.Type, _connection, _transaction, CommandType.Text, sql, _commandTimeout, dbParms, cancellationToken));
                }
                catch (Exception ex)
                {
                    exception = ex;
                    throw ex;
                }
                finally
                {
                    var after = new Aop.CurdAfterEventArgs(before, exception, ret);
                    _orm.Aop.CurdAfterHandler?.Invoke(this, after);
                }
            });

            if (dbParms != null)
            {
                this.ClearData();
                sbret.Clear();
            }
            return(ret);
        }
예제 #10
0
 public static TProperty Collate <TProperty>(
     [NotNull] this DbFunctions _,
     [NotNull] TProperty operand,
     [NotNull][NotParameterized] string collation)
 => throw new InvalidOperationException(CoreStrings.FunctionOnClient(nameof(Collate)));
예제 #11
0
        /// <summary>
        ///     This API supports the Entity Framework Core infrastructure and is not intended to be used
        ///     directly from your code. This API may change or be removed in future releases.
        /// </summary>
        protected virtual void ValidateData([NotNull] IModel model)
        {
            Check.NotNull(model, nameof(model));

            var identityMaps        = new Dictionary <IKey, IIdentityMap>();
            var sensitiveDataLogged = Dependencies.Logger.ShouldLogSensitiveData();

            foreach (var entityType in model.GetEntityTypes().Where(et => !et.IsQueryType))
            {
                var          key         = entityType.FindPrimaryKey();
                IIdentityMap identityMap = null;
                foreach (var seedDatum in entityType.GetData())
                {
                    foreach (var property in entityType.GetProperties())
                    {
                        if (!seedDatum.TryGetValue(property.Name, out var value) ||
                            value == null)
                        {
                            if (!property.IsNullable &&
                                (!property.RequiresValueGenerator() ||
                                 property.IsKey()))
                            {
                                throw new InvalidOperationException(CoreStrings.SeedDatumMissingValue(entityType.DisplayName(), property.Name));
                            }
                        }
                        else if (property.RequiresValueGenerator() &&
                                 property.IsKey() &&
                                 property.ClrType.IsDefaultValue(value))
                        {
                            if (property.ClrType.IsSignedInteger())
                            {
                                throw new InvalidOperationException(CoreStrings.SeedDatumSignedNumericValue(entityType.DisplayName(), property.Name));
                            }
                            throw new InvalidOperationException(CoreStrings.SeedDatumDefaultValue(entityType.DisplayName(), property.Name, property.ClrType.GetDefaultValue()));
                        }
                        else if (!property.ClrType.GetTypeInfo().IsAssignableFrom(value.GetType().GetTypeInfo()))
                        {
                            if (sensitiveDataLogged)
                            {
                                throw new InvalidOperationException(
                                          CoreStrings.SeedDatumIncompatibleValueSensitive(
                                              entityType.DisplayName(), value, property.Name, property.ClrType.DisplayName()));
                            }

                            throw new InvalidOperationException(
                                      CoreStrings.SeedDatumIncompatibleValue(
                                          entityType.DisplayName(), property.Name, property.ClrType.DisplayName()));
                        }
                    }

                    var keyValues = new object[key.Properties.Count];
                    for (var i = 0; i < key.Properties.Count; i++)
                    {
                        keyValues[i] = seedDatum[key.Properties[i].Name];
                    }

                    foreach (var navigation in entityType.GetNavigations())
                    {
                        if (seedDatum.TryGetValue(navigation.Name, out var value) &&
                            ((navigation.IsCollection() && value is IEnumerable collection && collection.Any()) ||
                             (!navigation.IsCollection() && value != null)))
                        {
                            if (sensitiveDataLogged)
                            {
                                throw new InvalidOperationException(
                                          CoreStrings.SeedDatumNavigationSensitive(
                                              entityType.DisplayName(),
                                              string.Join(", ", key.Properties.Select((p, i) => p.Name + ":" + keyValues[i])),
                                              navigation.Name,
                                              navigation.GetTargetType().DisplayName(),
                                              Property.Format(navigation.ForeignKey.Properties)));
                            }

                            throw new InvalidOperationException(
                                      CoreStrings.SeedDatumNavigation(
                                          entityType.DisplayName(),
                                          navigation.Name,
                                          navigation.GetTargetType().DisplayName(),
                                          Property.Format(navigation.ForeignKey.Properties)));
                        }
                    }

                    if (identityMap == null)
                    {
                        if (!identityMaps.TryGetValue(key, out identityMap))
                        {
                            identityMap       = key.GetIdentityMapFactory()(sensitiveDataLogged);
                            identityMaps[key] = identityMap;
                        }
                    }

                    var entry = identityMap.TryGetEntry(keyValues);
                    if (entry != null)
                    {
                        if (sensitiveDataLogged)
                        {
                            throw new InvalidOperationException(
                                      CoreStrings.SeedDatumDuplicateSensitive(
                                          entityType.DisplayName(), string.Join(", ", key.Properties.Select((p, i) => p.Name + ":" + keyValues[i]))));
                        }

                        throw new InvalidOperationException(
                                  CoreStrings.SeedDatumDuplicate(
                                      entityType.DisplayName(), Property.Format(key.Properties)));
                    }

                    entry = new InternalShadowEntityEntry(null, entityType);

                    identityMap.Add(keyValues, entry);
                }
            }
        }
예제 #12
0
        public override string ToSql()
        {
            if (_source?.Any() != true)
            {
                return(null);
            }

            var sqls     = new string[2];
            var dbParams = new List <DbParameter>();
            var ds       = SplitSourceByIdentityValueIsNull(_source);

            if (ds.Item1.Any())
            {
                sqls[0] = string.Join("\r\n\r\n;\r\n\r\n", ds.Item1.Select(a => getMergeSql(a)));
            }
            if (ds.Item2.Any())
            {
                sqls[1] = string.Join("\r\n\r\n;\r\n\r\n", ds.Item2.Select(a => getInsertSql(a)));
            }
            _params = dbParams.ToArray();
            if (ds.Item2.Any() == false)
            {
                return(sqls[0]);
            }
            if (ds.Item1.Any() == false)
            {
                return(sqls[1]);
            }
            return(string.Join("\r\n\r\n;\r\n\r\n", sqls));

            string getMergeSql(List <T1> data)
            {
                if (_table.Primarys.Any() == false)
                {
                    throw new Exception(CoreStrings.InsertOrUpdate_Must_Primary_Key(_table.CsName));
                }

                var sb = new StringBuilder().Append("MERGE INTO ").Append(_commonUtils.QuoteSqlName(TableRuleInvoke())).Append(" t1 \r\nUSING (");

                WriteSourceSelectUnionAll(data, sb, dbParams);
                sb.Append(" ) t2 ON (").Append(string.Join(" AND ", _table.Primarys.Select(a => $"t1.{_commonUtils.QuoteSqlName(a.Attribute.Name)} = t2.{_commonUtils.QuoteSqlName(a.Attribute.Name)}"))).Append(") \r\n");

                var cols = _table.Columns.Values.Where(a => a.Attribute.IsPrimary == false && a.Attribute.CanUpdate == true && _updateIgnore.ContainsKey(a.Attribute.Name) == false);

                if (_doNothing == false && cols.Any())
                {
                    sb.Append("WHEN MATCHED THEN \r\n")
                    .Append("  update set ").Append(string.Join(", ", cols.Select(a =>
                                                                                  a.Attribute.IsVersion && a.Attribute.MapType != typeof(byte[]) ?
                                                                                  $"{_commonUtils.QuoteSqlName(a.Attribute.Name)} = t1.{_commonUtils.QuoteSqlName(a.Attribute.Name)} + 1" :
                                                                                  $"{_commonUtils.QuoteSqlName(a.Attribute.Name)} = t2.{_commonUtils.QuoteSqlName(a.Attribute.Name)}"
                                                                                  ))).Append(" \r\n");
                }

                cols = _table.Columns.Values.Where(a => a.Attribute.CanInsert == true);
                if (cols.Any())
                {
                    sb.Append("WHEN NOT MATCHED THEN \r\n")
                    .Append("  insert (").Append(string.Join(", ", cols.Select(a => _commonUtils.QuoteSqlName(a.Attribute.Name)))).Append(") \r\n")
                    .Append("  values (").Append(string.Join(", ", cols.Select(a => $"t2.{_commonUtils.QuoteSqlName(a.Attribute.Name)}"))).Append(")");
                }

                return(sb.ToString());
            }

            string getInsertSql(List <T1> data)
            {
                var insert = _orm.Insert <T1>()
                             .AsTable(_tableRule).AsType(_table.Type)
                             .WithConnection(_connection)
                             .WithTransaction(_transaction)
                             .NoneParameter(true) as Internal.CommonProvider.InsertProvider <T1>;

                insert._source = data;
                insert._table  = _table;
                var sql = insert.ToSql();

                if (string.IsNullOrEmpty(sql))
                {
                    return(null);
                }
                if (insert._params?.Any() == true)
                {
                    dbParams.AddRange(insert._params);
                }
                return(sql);
            }
        }
예제 #13
0
        private async Task ProcessHeadersFrameAsync <TContext>(IHttpApplication <TContext> application)
        {
            if (_currentHeadersStream != null)
            {
                throw new Http2ConnectionErrorException(CoreStrings.FormatHttp2ErrorHeadersInterleaved(_incomingFrame.Type, _incomingFrame.StreamId, _currentHeadersStream.StreamId), Http2ErrorCode.PROTOCOL_ERROR);
            }

            if (_incomingFrame.StreamId == 0)
            {
                throw new Http2ConnectionErrorException(CoreStrings.FormatHttp2ErrorStreamIdZero(_incomingFrame.Type), Http2ErrorCode.PROTOCOL_ERROR);
            }

            if (_incomingFrame.HeadersHasPadding && _incomingFrame.HeadersPadLength >= _incomingFrame.Length)
            {
                throw new Http2ConnectionErrorException(CoreStrings.FormatHttp2ErrorPaddingTooLong(_incomingFrame.Type), Http2ErrorCode.PROTOCOL_ERROR);
            }

            if (_incomingFrame.HeadersHasPriority && _incomingFrame.HeadersStreamDependency == _incomingFrame.StreamId)
            {
                throw new Http2ConnectionErrorException(CoreStrings.FormatHttp2ErrorStreamSelfDependency(_incomingFrame.Type, _incomingFrame.StreamId), Http2ErrorCode.PROTOCOL_ERROR);
            }

            if (_streams.TryGetValue(_incomingFrame.StreamId, out var stream))
            {
                // http://httpwg.org/specs/rfc7540.html#rfc.section.5.1
                //
                // ...an endpoint that receives any frames after receiving a frame with the
                // END_STREAM flag set MUST treat that as a connection error (Section 5.4.1)
                // of type STREAM_CLOSED, unless the frame is permitted as described below.
                //
                // (The allowed frame types after END_STREAM are WINDOW_UPDATE, RST_STREAM and PRIORITY)
                if (stream.EndStreamReceived)
                {
                    throw new Http2ConnectionErrorException(CoreStrings.FormatHttp2ErrorStreamHalfClosedRemote(_incomingFrame.Type, stream.StreamId), Http2ErrorCode.STREAM_CLOSED);
                }

                // This is the last chance for the client to send END_STREAM
                if ((_incomingFrame.HeadersFlags & Http2HeadersFrameFlags.END_STREAM) == 0)
                {
                    throw new Http2ConnectionErrorException(CoreStrings.Http2ErrorHeadersWithTrailersNoEndStream, Http2ErrorCode.PROTOCOL_ERROR);
                }

                // Since we found an active stream, this HEADERS frame contains trailers
                _currentHeadersStream      = stream;
                _requestHeaderParsingState = RequestHeaderParsingState.Trailers;

                var endHeaders = (_incomingFrame.HeadersFlags & Http2HeadersFrameFlags.END_HEADERS) == Http2HeadersFrameFlags.END_HEADERS;
                await DecodeTrailersAsync(endHeaders, _incomingFrame.HeadersPayload);
            }
            else if (_incomingFrame.StreamId <= _highestOpenedStreamId)
            {
                // http://httpwg.org/specs/rfc7540.html#rfc.section.5.1.1
                //
                // The first use of a new stream identifier implicitly closes all streams in the "idle"
                // state that might have been initiated by that peer with a lower-valued stream identifier.
                //
                // If we couldn't find the stream, it was previously closed (either implicitly or with
                // END_STREAM or RST_STREAM).
                throw new Http2ConnectionErrorException(CoreStrings.FormatHttp2ErrorStreamClosed(_incomingFrame.Type, _incomingFrame.StreamId), Http2ErrorCode.STREAM_CLOSED);
            }
            else
            {
                // Start a new stream
                _currentHeadersStream = new Http2Stream(new Http2StreamContext
                {
                    ConnectionId          = ConnectionId,
                    StreamId              = _incomingFrame.StreamId,
                    ServiceContext        = _context.ServiceContext,
                    ConnectionFeatures    = _context.ConnectionFeatures,
                    MemoryPool            = _context.MemoryPool,
                    LocalEndPoint         = _context.LocalEndPoint,
                    RemoteEndPoint        = _context.RemoteEndPoint,
                    StreamLifetimeHandler = this,
                    FrameWriter           = _frameWriter
                });

                if ((_incomingFrame.HeadersFlags & Http2HeadersFrameFlags.END_STREAM) == Http2HeadersFrameFlags.END_STREAM)
                {
                    await _currentHeadersStream.OnDataAsync(Constants.EmptyData, endStream : true);
                }

                _currentHeadersStream.Reset();

                var endHeaders = (_incomingFrame.HeadersFlags & Http2HeadersFrameFlags.END_HEADERS) == Http2HeadersFrameFlags.END_HEADERS;
                await DecodeHeadersAsync(application, endHeaders, _incomingFrame.HeadersPayload);
            }
        }
예제 #14
0
        public override string ExpressionLambdaToSqlCallString(MethodCallExpression exp, ExpTSC tsc)
        {
            Func <Expression, string> getExp = exparg => ExpressionLambdaToSql(exparg, tsc);

            if (exp.Object == null)
            {
                switch (exp.Method.Name)
                {
                case "IsNullOrEmpty":
                    var arg1 = getExp(exp.Arguments[0]);
                    return($"({arg1} is null or {arg1} = '')");

                case "IsNullOrWhiteSpace":
                    var arg2 = getExp(exp.Arguments[0]);
                    return($"({arg2} is null or {arg2} = '' or ltrim({arg2}) = '')");

                case "Concat":
                    return(_common.StringConcat(exp.Arguments.Select(a => getExp(a)).ToArray(), null));

                case "Format":
                    if (exp.Arguments[0].NodeType != ExpressionType.Constant)
                    {
                        throw new Exception(CoreStrings.Not_Implemented_Expression_ParameterUseConstant(exp, exp.Arguments[0]));
                    }
                    var expArgsHack = exp.Arguments.Count == 2 && exp.Arguments[1].NodeType == ExpressionType.NewArrayInit ?
                                      (exp.Arguments[1] as NewArrayExpression).Expressions : exp.Arguments.Where((a, z) => z > 0);
                    //3个 {} 时,Arguments 解析出来是分开的
                    //4个 {} 时,Arguments[1] 只能解析这个出来,然后里面是 NewArray []
                    var expArgs = expArgsHack.Select(a => $"'||{_common.IsNull(ExpressionLambdaToSql(a, tsc), "''")}||'").ToArray();
                    return(string.Format(ExpressionLambdaToSql(exp.Arguments[0], tsc), expArgs));

                case "Join":     //未通用测试 #405
                    if (exp.IsStringJoin(out var tolistObjectExp, out var toListMethod, out var toListArgs1))
                    {
                        var newToListArgs0 = Expression.Call(tolistObjectExp, toListMethod,
                                                             Expression.Lambda(
                                                                 Expression.Call(
                                                                     typeof(SqlExtExtensions).GetMethod("StringJoinOracleGroupConcat"),
                                                                     Expression.Convert(toListArgs1.Body, typeof(object)),
                                                                     Expression.Convert(exp.Arguments[0], typeof(object))),
                                                                 toListArgs1.Parameters));
                        var newToListSql = getExp(newToListArgs0);
                        return(newToListSql);
                    }
                    break;
                }
            }
            else
            {
                var left = getExp(exp.Object);
                switch (exp.Method.Name)
                {
                case "StartsWith":
                case "EndsWith":
                case "Contains":
                    var args0Value = getExp(exp.Arguments[0]);
                    if (args0Value == "NULL")
                    {
                        return($"({left}) IS NULL");
                    }
                    var likeOpt = "LIKE";
                    if (exp.Arguments.Count > 1)
                    {
                        if (exp.Arguments[1].Type == typeof(bool) ||
                            exp.Arguments[1].Type == typeof(StringComparison))
                        {
                            likeOpt = "ILIKE";
                        }
                    }
                    if (exp.Method.Name == "StartsWith")
                    {
                        return($"({left}) {likeOpt} {(args0Value.EndsWith("'") ? args0Value.Insert(args0Value.Length - 1, "%") : $"(({args0Value})::text || '%')")}");
                    }
                    if (exp.Method.Name == "EndsWith")
                    {
                        return($"({left}) {likeOpt} {(args0Value.StartsWith("'") ? args0Value.Insert(1, "%") : $"('%' || ({args0Value})::text)")}");
                    }
                    if (args0Value.StartsWith("'") && args0Value.EndsWith("'"))
                    {
                        return($"({left}) {likeOpt} {args0Value.Insert(1, "%").Insert(args0Value.Length, "%")}");
                    }
                    return($"({left}) {likeOpt} ('%' || ({args0Value})::text || '%')");
        /// <summary>
        ///     This API supports the Entity Framework Core infrastructure and is not intended to be used
        ///     directly from your code. This API may change or be removed in future releases.
        /// </summary>
        public virtual InternalModelBuilder Apply(InternalModelBuilder modelBuilder)
        {
            foreach (var entityType in modelBuilder.Metadata.GetEntityTypes())
            {
                var unmappedProperty = entityType.GetProperties().FirstOrDefault(
                    p => (!ConfigurationSource.Convention.Overrides(p.GetConfigurationSource()) || !p.IsShadowProperty) &&
                    !IsMappedPrimitiveProperty(p));

                if (unmappedProperty != null)
                {
                    throw new InvalidOperationException(
                              CoreStrings.PropertyNotMapped(
                                  entityType.DisplayName(), unmappedProperty.Name, unmappedProperty.ClrType.ShortDisplayName()));
                }

                if (!entityType.HasClrType())
                {
                    continue;
                }

                var clrProperties = new HashSet <string>();

                clrProperties.UnionWith(
                    entityType.GetRuntimeProperties().Values
                    .Where(pi => pi.IsCandidateProperty())
                    .Select(pi => pi.GetSimpleMemberName()));

                clrProperties.ExceptWith(entityType.GetProperties().Select(p => p.Name));
                clrProperties.ExceptWith(entityType.GetNavigations().Select(p => p.Name));
                clrProperties.ExceptWith(entityType.GetServiceProperties().Select(p => p.Name));
                clrProperties.RemoveWhere(p => entityType.Builder.IsIgnored(p, ConfigurationSource.Convention));

                if (clrProperties.Count <= 0)
                {
                    continue;
                }

                foreach (var clrProperty in clrProperties)
                {
                    var actualProperty     = entityType.GetRuntimeProperties()[clrProperty];
                    var propertyType       = actualProperty.PropertyType;
                    var targetSequenceType = propertyType.TryGetSequenceType();

                    if (modelBuilder.IsIgnored(
                            modelBuilder.Metadata.GetDisplayName(propertyType),
                            ConfigurationSource.Convention) ||
                        (targetSequenceType != null &&
                         modelBuilder.IsIgnored(
                             modelBuilder.Metadata.GetDisplayName(targetSequenceType),
                             ConfigurationSource.Convention)))
                    {
                        continue;
                    }

                    var targetType = FindCandidateNavigationPropertyType(actualProperty);

                    var isTargetWeakOrOwned
                        = targetType != null &&
                          (modelBuilder.Metadata.HasEntityTypeWithDefiningNavigation(targetType) ||
                           modelBuilder.Metadata.ShouldBeOwnedType(targetType));

                    if (targetType?.IsValidEntityType() == true &&
                        (isTargetWeakOrOwned ||
                         modelBuilder.Metadata.FindEntityType(targetType) != null ||
                         targetType.GetRuntimeProperties().Any(p => p.IsCandidateProperty())))
                    {
                        // ReSharper disable CheckForReferenceEqualityInstead.1
                        // ReSharper disable CheckForReferenceEqualityInstead.3
                        if (entityType.GetDerivedTypes().All(
                                dt => dt.FindDeclaredNavigation(actualProperty.GetSimpleMemberName()) == null) &&
                            (!isTargetWeakOrOwned ||
                             (!targetType.Equals(entityType.ClrType) &&
                              (!entityType.IsInOwnershipPath(targetType) ||
                               (entityType.FindOwnership().PrincipalEntityType.ClrType.Equals(targetType) &&
                                targetSequenceType == null)) &&
                              (!entityType.IsInDefinitionPath(targetType) ||
                               (entityType.DefiningEntityType.ClrType.Equals(targetType) &&
                                targetSequenceType == null)))))
                        {
                            if (modelBuilder.Metadata.ShouldBeOwnedType(entityType.ClrType) &&
                                modelBuilder.Metadata.ShouldBeOwnedType(targetType))
                            {
                                throw new InvalidOperationException(
                                          CoreStrings.AmbiguousOwnedNavigation(entityType.DisplayName(), targetType.ShortDisplayName()));
                            }
                            throw new InvalidOperationException(
                                      CoreStrings.NavigationNotAdded(
                                          entityType.DisplayName(), actualProperty.Name, propertyType.ShortDisplayName()));
                        }
                        // ReSharper restore CheckForReferenceEqualityInstead.3
                        // ReSharper restore CheckForReferenceEqualityInstead.1
                    }
                    else if (targetSequenceType == null && propertyType.GetTypeInfo().IsInterface ||
                             targetSequenceType?.GetTypeInfo().IsInterface == true)
                    {
                        throw new InvalidOperationException(
                                  CoreStrings.InterfacePropertyNotAdded(
                                      entityType.DisplayName(), actualProperty.Name, propertyType.ShortDisplayName()));
                    }
                    else
                    {
                        throw new InvalidOperationException(
                                  CoreStrings.PropertyNotAdded(
                                      entityType.DisplayName(), actualProperty.Name, propertyType.ShortDisplayName()));
                    }
                }
            }

            return(modelBuilder);
        }
        /// <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 static bool TryGetMemberInfo(
            [NotNull] this IPropertyBase propertyBase,
            bool forConstruction,
            bool forSet,
            out MemberInfo memberInfo,
            out string errorMessage)
        {
            memberInfo   = null;
            errorMessage = null;

            var propertyInfo   = propertyBase.PropertyInfo;
            var fieldInfo      = propertyBase.FieldInfo;
            var setterProperty = propertyInfo?.FindSetterProperty();
            var getterProperty = propertyInfo?.FindGetterProperty();

            var isCollectionNav = (propertyBase as INavigation)?.IsCollection() == true;
            var hasField        = fieldInfo != null;
            var hasSetter       = setterProperty != null;
            var hasGetter       = getterProperty != null;

            var mode = propertyBase.GetPropertyAccessMode();

            if (forConstruction)
            {
                if (mode == PropertyAccessMode.Field ||
                    mode == PropertyAccessMode.FieldDuringConstruction)
                {
                    if (hasField)
                    {
                        memberInfo = fieldInfo;
                        return(true);
                    }

                    if (isCollectionNav)
                    {
                        return(true);
                    }

                    errorMessage = GetNoFieldErrorMessage(propertyBase);
                    return(false);
                }

                if (mode == PropertyAccessMode.Property)
                {
                    if (hasSetter)
                    {
                        memberInfo = setterProperty;
                        return(true);
                    }

                    if (isCollectionNav)
                    {
                        return(true);
                    }

                    errorMessage = hasGetter
                        ? CoreStrings.NoSetter(propertyBase.Name, propertyBase.DeclaringType.DisplayName(), nameof(PropertyAccessMode))
                        : CoreStrings.NoProperty(fieldInfo?.Name, propertyBase.DeclaringType.DisplayName(), nameof(PropertyAccessMode));

                    return(false);
                }

                if (mode == PropertyAccessMode.PreferField ||
                    mode == PropertyAccessMode.PreferFieldDuringConstruction)
                {
                    if (hasField)
                    {
                        memberInfo = fieldInfo;
                        return(true);
                    }

                    if (hasSetter)
                    {
                        memberInfo = setterProperty;
                        return(true);
                    }
                }

                if (mode == PropertyAccessMode.PreferProperty)
                {
                    if (hasSetter)
                    {
                        memberInfo = setterProperty;
                        return(true);
                    }

                    if (hasField)
                    {
                        memberInfo = fieldInfo;
                        return(true);
                    }
                }

                if (isCollectionNav)
                {
                    return(true);
                }

                errorMessage = CoreStrings.NoFieldOrSetter(propertyBase.Name, propertyBase.DeclaringType.DisplayName());
                return(false);
            }

            if (forSet)
            {
                if (mode == PropertyAccessMode.Field)
                {
                    if (hasField)
                    {
                        memberInfo = fieldInfo;
                        return(true);
                    }

                    if (isCollectionNav)
                    {
                        return(true);
                    }

                    errorMessage = GetNoFieldErrorMessage(propertyBase);
                    return(false);
                }

                if (mode == PropertyAccessMode.Property)
                {
                    if (hasSetter)
                    {
                        memberInfo = setterProperty;
                        return(true);
                    }

                    if (isCollectionNav)
                    {
                        return(true);
                    }

                    errorMessage = hasGetter
                        ? CoreStrings.NoSetter(propertyBase.Name, propertyBase.DeclaringType.DisplayName(), nameof(PropertyAccessMode))
                        : CoreStrings.NoProperty(fieldInfo?.Name, propertyBase.DeclaringType.DisplayName(), nameof(PropertyAccessMode));

                    return(false);
                }

                if (mode == PropertyAccessMode.PreferField)
                {
                    if (hasField)
                    {
                        memberInfo = fieldInfo;
                        return(true);
                    }

                    if (hasSetter)
                    {
                        memberInfo = setterProperty;
                        return(true);
                    }
                }

                if (mode == PropertyAccessMode.PreferProperty ||
                    mode == PropertyAccessMode.FieldDuringConstruction ||
                    mode == PropertyAccessMode.PreferFieldDuringConstruction)
                {
                    if (hasSetter)
                    {
                        memberInfo = setterProperty;
                        return(true);
                    }

                    if (hasField)
                    {
                        memberInfo = fieldInfo;
                        return(true);
                    }
                }

                if (isCollectionNav)
                {
                    return(true);
                }

                errorMessage = CoreStrings.NoFieldOrSetter(propertyBase.Name, propertyBase.DeclaringType.DisplayName());
                return(false);
            }

            // forGet
            if (mode == PropertyAccessMode.Field)
            {
                if (hasField)
                {
                    memberInfo = fieldInfo;
                    return(true);
                }

                errorMessage = GetNoFieldErrorMessage(propertyBase);
                return(false);
            }

            if (mode == PropertyAccessMode.Property)
            {
                if (hasGetter)
                {
                    memberInfo = getterProperty;
                    return(true);
                }

                errorMessage = hasSetter
                    ? CoreStrings.NoGetter(propertyBase.Name, propertyBase.DeclaringType.DisplayName(), nameof(PropertyAccessMode))
                    : CoreStrings.NoProperty(fieldInfo?.Name, propertyBase.DeclaringType.DisplayName(), nameof(PropertyAccessMode));

                return(false);
            }

            if (mode == PropertyAccessMode.PreferField)
            {
                if (hasField)
                {
                    memberInfo = fieldInfo;
                    return(true);
                }

                if (hasGetter)
                {
                    memberInfo = getterProperty;
                    return(true);
                }
            }

            if (mode == PropertyAccessMode.PreferProperty ||
                mode == PropertyAccessMode.FieldDuringConstruction ||
                mode == PropertyAccessMode.PreferFieldDuringConstruction)
            {
                if (hasGetter)
                {
                    memberInfo = getterProperty;
                    return(true);
                }

                if (hasField)
                {
                    memberInfo = fieldInfo;
                    return(true);
                }
            }

            errorMessage = CoreStrings.NoFieldOrGetter(propertyBase.Name, propertyBase.DeclaringType.DisplayName());
            return(false);
        }
예제 #17
0
 public FopePolicyRuleHasProhibitedRegularExpressionsException(int ruleId, string reason, Exception innerException) : base(CoreStrings.FopePolicyRuleHasProhibitedRegularExpressions(ruleId, reason), innerException)
 {
     this.ruleId = ruleId;
     this.reason = reason;
 }
예제 #18
0
 public void Use_of_custom_IPropertyBase_throws()
 {
     Assert.Equal(
         CoreStrings.CustomMetadata(nameof(Use_of_custom_IPropertyBase_throws), nameof(IPropertyBase), "IPropertyBaseProxy"),
         Assert.Throws <NotSupportedException>(() => Mock.Of <IPropertyBase>().AsPropertyBase()).Message);
 }
예제 #19
0
        public void Finding_targets_throws_for_entity_types_not_in_the_relationship()
        {
            var fk            = CreateOneToManyFK();
            var unrelatedType = fk.DeclaringEntityType.Model.AddEntityType(typeof(NavigationBase));

            Assert.Equal(
                CoreStrings.EntityTypeNotInRelationshipStrict(
                    unrelatedType.DisplayName(), fk.DeclaringEntityType.DisplayName(), fk.PrincipalEntityType.DisplayName()),
                Assert.Throws <InvalidOperationException>(() => fk.ResolveOtherEntityType(unrelatedType)).Message);
            Assert.Equal(
                CoreStrings.EntityTypeNotInRelationshipStrict(
                    unrelatedType.DisplayName(), fk.DeclaringEntityType.DisplayName(), fk.PrincipalEntityType.DisplayName()),
                Assert.Throws <InvalidOperationException>(() => fk.ResolveOtherEntityType(unrelatedType)).Message);

            Assert.Equal(
                CoreStrings.EntityTypeNotInRelationshipStrict(
                    unrelatedType.DisplayName(), fk.DeclaringEntityType.DisplayName(), fk.PrincipalEntityType.DisplayName()),
                Assert.Throws <InvalidOperationException>(() => fk.FindNavigationsFrom(unrelatedType)).Message);
            Assert.Equal(
                CoreStrings.EntityTypeNotInRelationshipStrict(
                    unrelatedType.DisplayName(), fk.DeclaringEntityType.DisplayName(), fk.PrincipalEntityType.DisplayName()),
                Assert.Throws <InvalidOperationException>(() => fk.FindNavigationsFrom(unrelatedType)).Message);

            Assert.Equal(
                CoreStrings.EntityTypeNotInRelationshipStrict(
                    unrelatedType.DisplayName(), fk.DeclaringEntityType.DisplayName(), fk.PrincipalEntityType.DisplayName()),
                Assert.Throws <InvalidOperationException>(() => fk.FindNavigationsTo(unrelatedType)).Message);
            Assert.Equal(
                CoreStrings.EntityTypeNotInRelationshipStrict(
                    unrelatedType.DisplayName(), fk.DeclaringEntityType.DisplayName(), fk.PrincipalEntityType.DisplayName()),
                Assert.Throws <InvalidOperationException>(() => fk.FindNavigationsTo(unrelatedType)).Message);

            Assert.Equal(
                CoreStrings.EntityTypeNotInRelationship(
                    unrelatedType.DisplayName(), fk.DeclaringEntityType.DisplayName(), fk.PrincipalEntityType.DisplayName()),
                Assert.Throws <InvalidOperationException>(() => fk.ResolveEntityTypeInHierarchy(unrelatedType)).Message);
            Assert.Equal(
                CoreStrings.EntityTypeNotInRelationship(
                    unrelatedType.DisplayName(), fk.DeclaringEntityType.DisplayName(), fk.PrincipalEntityType.DisplayName()),
                Assert.Throws <InvalidOperationException>(() => fk.ResolveEntityTypeInHierarchy(unrelatedType)).Message);

            Assert.Equal(
                CoreStrings.EntityTypeNotInRelationship(
                    unrelatedType.DisplayName(), fk.DeclaringEntityType.DisplayName(), fk.PrincipalEntityType.DisplayName()),
                Assert.Throws <InvalidOperationException>(() => fk.ResolveOtherEntityTypeInHierarchy(unrelatedType)).Message);
            Assert.Equal(
                CoreStrings.EntityTypeNotInRelationship(
                    unrelatedType.DisplayName(), fk.DeclaringEntityType.DisplayName(), fk.PrincipalEntityType.DisplayName()),
                Assert.Throws <InvalidOperationException>(() => fk.ResolveOtherEntityTypeInHierarchy(unrelatedType)).Message);

            Assert.Equal(
                CoreStrings.EntityTypeNotInRelationship(
                    unrelatedType.DisplayName(), fk.DeclaringEntityType.DisplayName(), fk.PrincipalEntityType.DisplayName()),
                Assert.Throws <InvalidOperationException>(() => fk.FindNavigationsFromInHierarchy(unrelatedType)).Message);
            Assert.Equal(
                CoreStrings.EntityTypeNotInRelationship(
                    unrelatedType.DisplayName(), fk.DeclaringEntityType.DisplayName(), fk.PrincipalEntityType.DisplayName()),
                Assert.Throws <InvalidOperationException>(() => fk.FindNavigationsFromInHierarchy(unrelatedType)).Message);

            Assert.Equal(
                CoreStrings.EntityTypeNotInRelationship(
                    unrelatedType.DisplayName(), fk.DeclaringEntityType.DisplayName(), fk.PrincipalEntityType.DisplayName()),
                Assert.Throws <InvalidOperationException>(() => fk.FindNavigationsToInHierarchy(unrelatedType)).Message);
            Assert.Equal(
                CoreStrings.EntityTypeNotInRelationship(
                    unrelatedType.DisplayName(), fk.DeclaringEntityType.DisplayName(), fk.PrincipalEntityType.DisplayName()),
                Assert.Throws <InvalidOperationException>(() => fk.FindNavigationsToInHierarchy(unrelatedType)).Message);
        }
예제 #20
0
 /// <summary>
 /// The soundex function converts a string to its Soundex code.
 /// </summary>
 /// <remarks>
 /// The method call is translated to <c>soundex(text)</c>.
 ///
 /// See https://www.postgresql.org/docs/current/fuzzystrmatch.html.
 /// </remarks>
 public static string FuzzyStringMatchSoundex(this DbFunctions _, string text)
 => throw new InvalidOperationException(CoreStrings.FunctionOnClient(nameof(FuzzyStringMatchSoundex)));
예제 #21
0
 public void Use_of_custom_IKey_throws()
 {
     Assert.Equal(
         CoreStrings.CustomMetadata(nameof(Use_of_custom_IKey_throws), nameof(IKey), "IKeyProxy"),
         Assert.Throws <NotSupportedException>(() => Mock.Of <IKey>().AsKey()).Message);
 }
예제 #22
0
 /// <summary>
 /// Returns the Levenshtein distance between two strings.
 /// </summary>
 /// <remarks>
 /// The method call is translated to <c>levenshtein(source, target)</c>.
 ///
 /// See https://www.postgresql.org/docs/current/fuzzystrmatch.html.
 /// </remarks>
 public static int FuzzyStringMatchLevenshtein(this DbFunctions _, string source, string target)
 => throw new InvalidOperationException(CoreStrings.FunctionOnClient(nameof(FuzzyStringMatchLevenshtein)));
예제 #23
0
 public override void Value_conversion_on_enum_collection_contains()
 {
     Assert.Contains(
         CoreStrings.TranslationFailed("").Substring(47),
         Assert.Throws <InvalidOperationException>(() => base.Value_conversion_on_enum_collection_contains()).Message);
 }
예제 #24
0
 /// <summary>
 /// levenshtein_less_equal is an accelerated version of the Levenshtein function for use when only small distances are of interest.
 /// If the actual distance is less than or equal to maximum distance, then levenshtein_less_equal returns the correct distance;
 /// otherwise it returns some value greater than maximum distance. If maximum distance is negative then the behavior is the same as levenshtein.
 /// </summary>
 /// <remarks>
 /// The method call is translated to <c>levenshtein_less_equal(source, target, insertionCost, deletionCost, substitutionCost, maximumDistance)</c>.
 ///
 /// See https://www.postgresql.org/docs/current/fuzzystrmatch.html.
 /// </remarks>
 public static int FuzzyStringMatchLevenshteinLessEqual(this DbFunctions _, string source, string target, int insertionCost, int deletionCost, int substitutionCost, int maximumDistance)
 => throw new InvalidOperationException(CoreStrings.FunctionOnClient(nameof(FuzzyStringMatchLevenshteinLessEqual)));
        /// <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 override ValueGenerator Create(IProperty property)
        {
            var type = property.ClrType.UnwrapNullableType().UnwrapEnumType();

            if (type == typeof(int))
            {
                return(new TemporaryIntValueGenerator());
            }

            if (type == typeof(long))
            {
                return(new TemporaryLongValueGenerator());
            }

            if (type == typeof(short))
            {
                return(new TemporaryShortValueGenerator());
            }

            if (type == typeof(byte))
            {
                return(new TemporaryByteValueGenerator());
            }

            if (type == typeof(char))
            {
                return(new TemporaryCharValueGenerator());
            }

            if (type == typeof(ulong))
            {
                return(new TemporaryULongValueGenerator());
            }

            if (type == typeof(uint))
            {
                return(new TemporaryUIntValueGenerator());
            }

            if (type == typeof(ushort))
            {
                return(new TemporaryUShortValueGenerator());
            }

            if (type == typeof(sbyte))
            {
                return(new TemporarySByteValueGenerator());
            }

            if (type == typeof(decimal))
            {
                return(new TemporaryDecimalValueGenerator());
            }

            if (type == typeof(float))
            {
                return(new TemporaryFloatValueGenerator());
            }

            if (type == typeof(double))
            {
                return(new TemporaryDoubleValueGenerator());
            }

            throw new ArgumentException(
                      CoreStrings.InvalidValueGeneratorFactoryProperty(
                          nameof(TemporaryNumberValueGeneratorFactory), property.Name, property.DeclaringEntityType.DisplayName()));
        }
예제 #26
0
 /// <summary>
 /// The metaphone function converts a string to its Metaphone code.
 /// </summary>
 /// <remarks>
 /// The method call is translated to <c>metaphone(text, maximumOutputLength)</c>.
 ///
 /// See https://www.postgresql.org/docs/current/fuzzystrmatch.html.
 /// </remarks>
 public static string FuzzyStringMatchMetaphone(this DbFunctions _, string text, int maximumOutputLength)
 => throw new InvalidOperationException(CoreStrings.FunctionOnClient(nameof(FuzzyStringMatchMetaphone)));
예제 #27
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 Expression CreateMaterializeExpression(
            IEntityType entityType,
            string entityInstanceName,
            Expression materializationContextExpression,
            int[] indexMap = null)
        {
            if (!entityType.HasClrType())
            {
                throw new InvalidOperationException(CoreStrings.NoClrType(entityType.DisplayName()));
            }

            if (entityType.IsAbstract())
            {
                throw new InvalidOperationException(CoreStrings.CannotMaterializeAbstractType(entityType));
            }

            var constructorBinding = (InstantiationBinding)entityType[CoreAnnotationNames.ConstructorBinding];

            if (constructorBinding == null)
            {
                var constructorInfo = entityType.ClrType.GetDeclaredConstructor(null);

                if (constructorInfo == null)
                {
                    throw new InvalidOperationException(CoreStrings.NoParameterlessConstructor(entityType.DisplayName()));
                }

                constructorBinding = new ConstructorBinding(constructorInfo, Array.Empty <ParameterBinding>());
            }

            var bindingInfo = new ParameterBindingInfo(
                entityType,
                materializationContextExpression,
                indexMap);

            var properties = new HashSet <IPropertyBase>(
                entityType.GetServiceProperties().Cast <IPropertyBase>()
                .Concat(
                    entityType
                    .GetProperties()
                    .Where(p => !p.IsShadowProperty())));

            foreach (var consumedProperty in constructorBinding
                     .ParameterBindings
                     .SelectMany(p => p.ConsumedProperties))
            {
                properties.Remove(consumedProperty);
            }

            var constructorExpression = constructorBinding.CreateConstructorExpression(bindingInfo);

            if (properties.Count == 0)
            {
                return(constructorExpression);
            }

            var instanceVariable = Expression.Variable(constructorBinding.RuntimeType, entityInstanceName);

            var blockExpressions
                = new List <Expression>
                {
                Expression.Assign(
                    instanceVariable,
                    constructorExpression)
                };

            var valueBufferExpression = Expression.Call(materializationContextExpression, MaterializationContext.GetValueBufferMethod);

            foreach (var property in properties)
            {
                var memberInfo = property.GetMemberInfo(forConstruction: true, forSet: true);

                var readValueExpression
                    = property is IServiceProperty serviceProperty
                        ? serviceProperty.GetParameterBinding().BindToParameter(bindingInfo)
                        : CreateReadValueExpression(
                          valueBufferExpression,
                          memberInfo.GetMemberType(),
                          indexMap?[property.GetIndex()] ?? property.GetIndex(),
                          property);

                blockExpressions.Add(
                    Expression.MakeMemberAccess(
                        instanceVariable,
                        memberInfo).Assign(
                        readValueExpression));
            }

            blockExpressions.Add(instanceVariable);

            return(Expression.Block(
                       new[]
            {
                instanceVariable
            }, blockExpressions));
        }
예제 #28
0
 /// <summary>
 /// The dmetaphone function converts a string to its primary Double Metaphone code.
 /// </summary>
 /// <remarks>
 /// The method call is translated to <c>dmetaphone(text)</c>.
 ///
 /// See https://www.postgresql.org/docs/current/fuzzystrmatch.html.
 /// </remarks>
 public static string FuzzyStringMatchDoubleMetaphone(this DbFunctions _, string text)
 => throw new InvalidOperationException(CoreStrings.FunctionOnClient(nameof(FuzzyStringMatchDoubleMetaphone)));
        /// <summary>
        ///     This API supports the Entity Framework Core infrastructure and is not intended to be used
        ///     directly from your code. This API may change or be removed in future releases.
        /// </summary>
        public virtual InternalModelBuilder Apply(InternalModelBuilder modelBuilder)
        {
            foreach (var entityType in modelBuilder.Metadata.GetEntityTypes())
            {
                if (entityType.ClrType?.IsAbstract == false)
                {
                    var maxServiceParams  = 0;
                    var minPropertyParams = int.MaxValue;
                    var foundBindings     = new List <ConstructorBinding>();
                    var bindingFailures   = new List <IEnumerable <ParameterInfo> >();

                    foreach (var constructor in entityType.ClrType.GetTypeInfo()
                             .DeclaredConstructors
                             .Where(c => !c.IsStatic))
                    {
                        // Trying to find the constructor with the most service properties
                        // followed by the least scalar property parameters
                        if (_bindingFactory.TryBindConstructor(entityType, constructor, out var binding, out var failures))
                        {
                            var serviceParamCount  = binding.ParameterBindings.OfType <ServiceParameterBinding>().Count();
                            var propertyParamCount = binding.ParameterBindings.Count - serviceParamCount;

                            if (serviceParamCount == maxServiceParams &&
                                propertyParamCount == minPropertyParams)
                            {
                                foundBindings.Add(binding);
                            }
                            else if (serviceParamCount > maxServiceParams)
                            {
                                foundBindings.Clear();
                                foundBindings.Add(binding);

                                maxServiceParams  = serviceParamCount;
                                minPropertyParams = propertyParamCount;
                            }
                            else if (propertyParamCount < minPropertyParams)
                            {
                                foundBindings.Clear();
                                foundBindings.Add(binding);

                                maxServiceParams  = serviceParamCount;
                                minPropertyParams = propertyParamCount;
                            }
                        }
                        else
                        {
                            bindingFailures.Add(failures);
                        }
                    }

                    if (foundBindings.Count == 0)
                    {
                        var constructorErrors = bindingFailures.SelectMany(f => f)
                                                .GroupBy(f => f.Member as ConstructorInfo)
                                                .Select(
                            x =>
                            CoreStrings.ConstructorBindingFailed(
                                string.Join("', '", x.Select(f => f.Name)),
                                entityType.DisplayName() + "(" +
                                string.Join(
                                    ", ", x.Key.GetParameters().Select(
                                        y =>
                                        y.ParameterType.ShortDisplayName() + " " + y.Name)
                                    ) +
                                ")"
                                )
                            );

                        throw new InvalidOperationException(
                                  CoreStrings.ConstructorNotFound(
                                      entityType.DisplayName(),
                                      string.Join("; ", constructorErrors)));
                    }

                    if (foundBindings.Count > 1)
                    {
                        throw new InvalidOperationException(
                                  CoreStrings.ConstructorConflict(
                                      FormatConstructorString(entityType, foundBindings[0]),
                                      FormatConstructorString(entityType, foundBindings[1])));
                    }

                    entityType.Builder.HasAnnotation(
                        CoreAnnotationNames.ConstructorBinding,
                        foundBindings[0],
                        ConfigurationSource.Convention);
                }
예제 #30
0
 /// <summary>
 ///     Returns a warning-as-error exception wrapping the given message for this event.
 /// </summary>
 /// <param name="message"> The message to wrap. </param>
 protected virtual Exception WarningAsError([NotNull] string message)
 => new InvalidOperationException(
     CoreStrings.WarningAsErrorTemplate(
         EventId.ToString(),
         message,
         EventIdCode ?? EventId.Id.ToString()));