コード例 #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>
    protected virtual void ProcessDbFunctionAdded(
        IConventionDbFunctionBuilder dbFunctionBuilder,
        IConventionContext context)
    {
        var methodInfo          = dbFunctionBuilder.Metadata.MethodInfo;
        var dbFunctionAttribute = methodInfo?.GetCustomAttributes <DbFunctionAttribute>().SingleOrDefault();

        if (dbFunctionAttribute != null)
        {
            dbFunctionBuilder.HasName(dbFunctionAttribute.Name, fromDataAnnotation: true);
            if (dbFunctionAttribute.Schema != null)
            {
                dbFunctionBuilder.HasSchema(dbFunctionAttribute.Schema, fromDataAnnotation: true);
            }

            if (dbFunctionAttribute.IsBuiltIn)
            {
                dbFunctionBuilder.IsBuiltIn(dbFunctionAttribute.IsBuiltIn, fromDataAnnotation: true);
            }

            if (dbFunctionAttribute.IsNullableHasValue)
            {
                dbFunctionBuilder.IsNullable(dbFunctionAttribute.IsNullable, fromDataAnnotation: true);
            }
        }
    }
コード例 #2
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);
        }
        /// <summary>
        ///     Called when an <see cref="IMutableDbFunction"/> is added to the model.
        /// </summary>
        /// <param name="dbFunctionBuilder"> The builder for the <see cref="IMutableDbFunction"/>. </param>
        /// <param name="context"> Additional information associated with convention execution. </param>
        protected override void ProcessDbFunctionAdded(
            IConventionDbFunctionBuilder dbFunctionBuilder, IConventionContext context)
        {
            base.ProcessDbFunctionAdded(dbFunctionBuilder, context);

            ((DbFunction)dbFunctionBuilder.Metadata).DefaultSchema = "dbo";
        }
コード例 #4
0
        /// <summary>
        ///     Called when an <see cref="IMutableDbFunction"/> is added to the model.
        /// </summary>
        /// <param name="dbFunctionBuilder"> The builder for the <see cref="IMutableDbFunction"/>. </param>
        /// <param name="context"> Additional information associated with convention execution. </param>
        protected virtual void ProcessDbFunctionAdded(
            [NotNull] IConventionDbFunctionBuilder dbFunctionBuilder, [NotNull] IConventionContext context)
        {
            var methodInfo          = dbFunctionBuilder.Metadata.MethodInfo;
            var dbFunctionAttribute = methodInfo.GetCustomAttributes <DbFunctionAttribute>().SingleOrDefault();

            dbFunctionBuilder.HasName(dbFunctionAttribute?.FunctionName ?? methodInfo.Name);
            dbFunctionBuilder.HasSchema(dbFunctionAttribute?.Schema);
        }
コード例 #5
0
        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);
            }
        }
コード例 #6
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(
            [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();
        }