/// <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); } } }
/// <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"; }
/// <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); }
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); } }
/// <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(); }