AspNetCoreOData icon indicating copy to clipboard operation
AspNetCoreOData copied to clipboard

.HasComputed().IsComputed(true) throw error for enum values

Open davhdavh opened this issue 3 years ago • 3 comments

entity.Property(x=>x.MyEnumValue).HasComputed().IsComputed(true) throws error that MyEnumValue is not a basetype.

public MyEnum MyEnumValue {get;set;}

davhdavh avatar Feb 27 '22 10:02 davhdavh

Kindly share a stack trace for this error

KenitoInc avatar Mar 01 '22 18:03 KenitoInc

System.ArgumentException
  HResult=0x80070057
  Message=The property 'ResourceType'  on type 'xxxWebCore.Areas.OData.Infrastructure.SimpleResourceOData' must be a Primitive property. (Parameter 'propertyInfo')
  Source=Microsoft.OData.ModelBuilder
  StackTrace:
   at Microsoft.OData.ModelBuilder.StructuralTypeConfiguration.ValidatePropertyNotAlreadyDefinedOtherTypes[T](PropertyInfo propertyInfo, String typeErrorMessage)
   at Microsoft.OData.ModelBuilder.StructuralTypeConfiguration.AddProperty(PropertyInfo propertyInfo)
   at Microsoft.OData.ModelBuilder.StructuralTypeConfiguration`1.GetPrimitivePropertyConfiguration(Expression propertyExpression, Boolean nullable)
   at Microsoft.OData.ModelBuilder.StructuralTypeConfiguration`1.Property[T](Expression`1 propertyExpression)
   at xxxWebCore.Areas.OData.Infrastructure.SimpleResourceOData.<>c.<GetModel>b__29_0(ODataConventionModelBuilder builder) in D:\src\cghg\xxxWebCore\Areas\OData\Infrastructure\SimpleResourceOData.cs:line 77
   at Microsoft.OData.ModelBuilder.ODataConventionModelBuilder.GetEdmModel()
   at xxxWebCore.Areas.OData.Infrastructure.CgEdmModel.BuildModel() in D:\src\cghg\xxxWebCore\Areas\OData\Infrastructure\CgEdmModel.cs:line 28
   at xxxWebCore.Areas.OData.Infrastructure.CgEdmModel.SetDefaultOptions(ODataOptions o) in D:\src\cghg\xxxWebCore\Areas\OData\Infrastructure\CgEdmModel.cs:line 16
   at Microsoft.Extensions.Options.ConfigureNamedOptions`1.Configure(String name, TOptions options)
   at Microsoft.Extensions.Options.OptionsFactory`1.Create(String name)
   at Microsoft.Extensions.Options.UnnamedOptionsManager`1.get_Value()
   at Microsoft.AspNetCore.OData.Routing.ODataRoutingApplicationModelProvider..ctor(IOptions`1 options)
   at System.RuntimeMethodHandle.InvokeMethod(Object target, Span`1& arguments, Signature sig, Boolean constructor, Boolean wrapExceptions)
   at System.Reflection.RuntimeConstructorInfo.Invoke(BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
   at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitConstructor(ConstructorCallSite constructorCallSite, RuntimeResolverContext context)
   at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor`2.VisitCallSiteMain(ServiceCallSite callSite, TArgument argument)
   at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor`2.VisitCallSite(ServiceCallSite callSite, TArgument argument)
   at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitIEnumerable(IEnumerableCallSite enumerableCallSite, RuntimeResolverContext context)
   at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor`2.VisitCallSiteMain(ServiceCallSite callSite, TArgument argument)
   at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor`2.VisitCallSite(ServiceCallSite callSite, TArgument argument)
   at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitConstructor(ConstructorCallSite constructorCallSite, RuntimeResolverContext context)
   at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor`2.VisitCallSiteMain(ServiceCallSite callSite, TArgument argument)
   at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitRootCache(ServiceCallSite callSite, RuntimeResolverContext context)
   at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor`2.VisitCallSite(ServiceCallSite callSite, TArgument argument)
   at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitConstructor(ConstructorCallSite constructorCallSite, RuntimeResolverContext context)
   at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor`2.VisitCallSiteMain(ServiceCallSite callSite, TArgument argument)
   at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor`2.VisitCallSite(ServiceCallSite callSite, TArgument argument)
   at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitIEnumerable(IEnumerableCallSite enumerableCallSite, RuntimeResolverContext context)
   at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor`2.VisitCallSiteMain(ServiceCallSite callSite, TArgument argument)
   at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor`2.VisitCallSite(ServiceCallSite callSite, TArgument argument)
   at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitConstructor(ConstructorCallSite constructorCallSite, RuntimeResolverContext context)
   at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor`2.VisitCallSiteMain(ServiceCallSite callSite, TArgument argument)
   at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitRootCache(ServiceCallSite callSite, RuntimeResolverContext context)
   at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor`2.VisitCallSite(ServiceCallSite callSite, TArgument argument)
   at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitConstructor(ConstructorCallSite constructorCallSite, RuntimeResolverContext context)
   at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor`2.VisitCallSiteMain(ServiceCallSite callSite, TArgument argument)
   at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitRootCache(ServiceCallSite callSite, RuntimeResolverContext context)
   at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor`2.VisitCallSite(ServiceCallSite callSite, TArgument argument)
   at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.Resolve(ServiceCallSite callSite, ServiceProviderEngineScope scope)
   at Microsoft.Extensions.DependencyInjection.ServiceProvider.CreateServiceAccessor(Type serviceType)
   at System.Collections.Concurrent.ConcurrentDictionary`2.GetOrAdd(TKey key, Func`2 valueFactory)
   at Microsoft.Extensions.DependencyInjection.ServiceProvider.GetService(Type serviceType, ServiceProviderEngineScope serviceProviderEngineScope)
   at Microsoft.Extensions.DependencyInjection.ServiceProvider.GetService(Type serviceType)
   at Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetService[T](IServiceProvider provider)
   at Microsoft.AspNetCore.Builder.RazorPagesEndpointRouteBuilderExtensions.EnsureRazorPagesServices(IEndpointRouteBuilder endpoints)
   at Microsoft.AspNetCore.Builder.RazorPagesEndpointRouteBuilderExtensions.MapRazorPages(IEndpointRouteBuilder endpoints)
   at Program.<Main>$(String[] args) in D:\src\cghg\xxxWebCore\Program.cs:line 198
   public enum ResourceType : byte {...}

   public ResourceType    ResourceType { get => R.ResourceType; set { } }
   internal static void IsComputed(PropertyConfiguration p) => p.HasComputed().IsComputed(true);

internal static void GetModel(ODataConventionModelBuilder builder)
   {
      builder.OnModelCreating += static builder => {
         var tbl = builder.EntityType<SimpleResourceOData>();
         tbl.Name = "SimpleResource";
         IsComputed(tbl.Property(x=>x.ResourceType));
      };
   }

davhdavh avatar Mar 03 '22 11:03 davhdavh

We are running into a similar issue. We get the same error when declaring a read-only property without a setter. We found a workaround that if you add a setter to the property it works fine.

Model config:

 entitySetConfig.EntityType.Property(p => p.Category)
		.HasComputed()
		.IsComputed(true);

This throws an exception at startup in the model builder:

public CategoryEnum Category
{
  get  { .... logic... }
}

but if we do this as a workaround it works fine.

public CategoryEnum Category
{
  get  { .... logic... }
  set  { throw new NotSupportedException(); }
}

jusbuc2k avatar May 30 '24 12:05 jusbuc2k