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