AspNetCoreOData
AspNetCoreOData copied to clipboard
.HasComputed().IsComputed(true) throw error for enum values
entity.Property(x=>x.MyEnumValue).HasComputed().IsComputed(true) throws error that MyEnumValue is not a basetype.
public MyEnum MyEnumValue {get;set;}
Kindly share a stack trace for this error
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));
};
}
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(); }
}