示例#1
0
        /// <summary>
        ///     Called when an <see cref="IConventionDbFunction" /> is added to the model.
        /// </summary>
        /// <param name="dbFunctionBuilder"> The builder for the <see cref="IConventionDbFunction" />. </param>
        /// <param name="context"> Additional information associated with convention execution. </param>
        private void ProcessDbFunctionAdded(
            IConventionDbFunctionBuilder dbFunctionBuilder,
            IConventionContext context)
        {
            var function = dbFunctionBuilder.Metadata;

            if (function.IsScalar)
            {
                return;
            }

            var elementType = function.ReturnType.TryGetElementType(typeof(IQueryable <>)) !;

            if (!elementType.IsValidEntityType())
            {
                throw new InvalidOperationException(
                          RelationalStrings.DbFunctionInvalidIQueryableReturnType(
                              function.ModelName, function.ReturnType.ShortDisplayName()));
            }

            var model      = function.Model;
            var entityType = model.FindEntityType(elementType);

            if (entityType?.IsOwned() == true ||
                model.IsOwned(elementType) ||
                (entityType == null && model.FindEntityTypes(elementType).Any()))
            {
                return;
            }

            dbFunctionBuilder.ModelBuilder.Entity(elementType);
        }
        private void ProcessDbFunctionAdded(
            [NotNull] IConventionDbFunctionBuilder dbFunctionBuilder,
            [NotNull] IConventionContext context)
        {
            var function = dbFunctionBuilder.Metadata;

            if (function.IsScalar)
            {
                return;
            }

            var elementType = function.ReturnType.TryGetElementType(typeof(IQueryable <>)) !;

            if (!elementType.IsValidEntityType())
            {
                throw new InvalidOperationException(
                          RelationalStrings.DbFunctionInvalidIQueryableReturnType(
                              function.ModelName, function.ReturnType.ShortDisplayName()));
            }

            var model      = function.Model;
            var entityType = model.FindEntityType(elementType);

            if (entityType?.IsOwned() == true ||
                model.IsOwned(elementType) ||
                (entityType == null && model.GetEntityTypes().Any(e => e.ClrType == elementType)))
            {
                return;
            }

            IConventionEntityTypeBuilder?entityTypeBuilder;

            if (entityType != null)
            {
                entityTypeBuilder = entityType.Builder;
            }
            else
            {
                entityTypeBuilder = dbFunctionBuilder.ModelBuilder.Entity(elementType);
                if (entityTypeBuilder == null)
                {
                    return;
                }

                entityType = entityTypeBuilder.Metadata;
            }

            if (entityType.GetFunctionName() == null)
            {
                entityTypeBuilder.ToTable(null);
            }
        }
        public void Throws_when_adding_a_function_returning_a_scalar()
        {
            var modelBuilder = CreateModelBuilder();

            modelBuilder.HasDbFunction(typeof(TableValuedDbFunctionConventionTest).GetMethod(
                                           nameof(GetScalars),
                                           BindingFlags.NonPublic | BindingFlags.Static));

            Assert.Equal(
                RelationalStrings.DbFunctionInvalidIQueryableReturnType(
                    nameof(GetScalars), typeof(IQueryable <int>).ShortDisplayName()),
                Assert.Throws <InvalidOperationException>(() => modelBuilder.FinalizeModel()).Message);
        }
示例#4
0
        public void Throws_when_adding_a_function_returning_a_scalar()
        {
            var modelBuilder = CreateModelBuilder();

            modelBuilder.HasDbFunction(
                typeof(TableValuedDbFunctionConventionTest).GetMethod(
                    nameof(GetScalars),
                    BindingFlags.NonPublic | BindingFlags.Static));

            Assert.Equal(
                RelationalStrings.DbFunctionInvalidIQueryableReturnType(
                    "Microsoft.EntityFrameworkCore.Metadata.Conventions.Internal.TableValuedDbFunctionConventionTest.GetScalars(System.Int32)",
                    typeof(IQueryable <int>).ShortDisplayName()),
                Assert.Throws <InvalidOperationException>(() => Finalize(modelBuilder)).Message);
        }
        /// <summary>
        ///     Called when an <see cref="IConventionDbFunction" /> is added to the model.
        /// </summary>
        /// <param name="dbFunctionBuilder"> The builder for the <see cref="IConventionDbFunction" />. </param>
        /// <param name="context"> Additional information associated with convention execution. </param>
        private void ProcessDbFunctionAdded(
            [NotNull] IConventionDbFunctionBuilder dbFunctionBuilder, [NotNull] IConventionContext context)
        {
            var function = dbFunctionBuilder.Metadata;

            if (!function.IsQueryable)
            {
                return;
            }

            var elementType = function.ReturnType.TryGetElementType(typeof(IQueryable <>));

            if (!elementType.IsValidEntityType())
            {
                throw new InvalidOperationException(RelationalStrings.DbFunctionInvalidIQueryableReturnType(
                                                        function.Name, function.ReturnType.ShortDisplayName()));
            }

            var model = function.Model;
            IConventionEntityTypeBuilder entityTypeBuilder;
            var entityType = model.FindEntityType(elementType);

            if (entityType?.IsOwned() == true || model.IsOwned(elementType))
            {
                throw new InvalidOperationException(RelationalStrings.DbFunctionInvalidIQueryableOwnedReturnType(
                                                        function.Name, function.ReturnType.ShortDisplayName()));
            }

            if (entityType != null)
            {
                entityTypeBuilder = entityType.Builder;
            }
            else
            {
                entityTypeBuilder = dbFunctionBuilder.ModelBuilder.Entity(elementType);
                if (entityTypeBuilder == null)
                {
                    return;
                }
            }

            entityTypeBuilder.ToTable(null);
            entityTypeBuilder.HasNoKey();
        }