【问题标题】:How to use user-defined function in Entity Framework Core (Oracle)?如何在 Entity Framework Core (Oracle) 中使用用户定义的函数?
【发布时间】:2021-04-17 14:58:19
【问题描述】:

我刚刚开始在 .NET Core 3.1 项目中将 Entity Framework Core 与 Oracle 数据库一起使用,并且在尝试调用用户定义的函数时一直遇到问题。

数据库中的函数如下所示:

FUNCTION fnc_hourly_data(
    p_quality   IN t_quality_configurations.quality%TYPE DEFAULT NULL,
    p_date       IN DATE DEFAULT SYSDATE)
    RETURN hourly_data_arr_type IS
    v_result   hourly_data_arr_type := hourly_data_arr_type ();

我尝试按照this 教程将方法映射到此函数,因此我将此代码添加到ModelContextOnModelCreating 函数中:

modelBuilder.HasDbFunction(typeof(ModelContext).GetMethod(nameof(FncHourlyData), new[] { typeof(IEnumerable<HourlyData>) })).HasName("fnc_hourly_data");

我还按照教程中的描述定义了这个函数:

public IEnumerable<HourlyData> FncHourlyData(string quality, DateTime date) => throw new NotSupportedException();

当我现在执行应用程序时,我收到以下错误:

System.ArgumentNullException
HResult=0x80004003
Message=Value 不能为空。
Source=Microsoft.EntityFrameworkCore.Relational

堆栈跟踪:

在 Microsoft.EntityFrameworkCore.Utilities.Check.NotNull[T](T 值,字符串参数名称)
在 Microsoft.EntityFrameworkCore.RelationalModelBuilderExtensions.HasDbFunction(ModelBuilder modelBuilder, MethodInfo methodInfo)
在 ORMTest.Model.HourlyDataModel.ModelContext.OnModelCreating(ModelBuilder modelBuilder) 在 C:\Projects...\ModelContext.cs:line 49
在 Microsoft.EntityFrameworkCore.Infrastructure.ModelCustomizer.Customize(ModelBuilder modelBuilder,DbContext 上下文)
在 Microsoft.EntityFrameworkCore.Infrastructure.ModelSource.CreateModel(DbContext 上下文,IConventionSetBuilder 约定SetBuilder)
在 Microsoft.EntityFrameworkCore.Infrastructure.ModelSource.GetModel(DbContext 上下文,IConventionSetBuilder 约定SetBuilder)
在 Microsoft.EntityFrameworkCore.Internal.DbContextServices.CreateModel()
在 Microsoft.EntityFrameworkCore.Internal.DbContextServices.get_Model()
在 Microsoft.EntityFrameworkCore.Infrastructure.EntityFrameworkServicesBuilder.c.b__7_3(IServiceProvider p)
在 Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitFactory(FactoryCallSite factoryCallSite,RuntimeResolverContext 上下文)
在 Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor2.VisitCallSiteMain(ServiceCallSite callSite, TArgument argument) at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitCache(ServiceCallSite callSite, RuntimeResolverContext context, ServiceProviderEngineScope serviceProviderEngine, RuntimeResolverLock lockType) at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitScopeCache(ServiceCallSite singletonCallSite, RuntimeResolverContext context) at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor2.VisitCallSite(ServiceCallSite callSite,TArgument 参数) 在 Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitConstructor(ConstructorCallSite 构造函数CallSite,RuntimeResolverContext 上下文) 在 Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor2.VisitCallSiteMain(ServiceCallSite callSite, TArgument argument) at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitCache(ServiceCallSite callSite, RuntimeResolverContext context, ServiceProviderEngineScope serviceProviderEngine, RuntimeResolverLock lockType) at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitScopeCache(ServiceCallSite singletonCallSite, RuntimeResolverContext context) at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor2.VisitCallSite(ServiceCallSite callSite,TArgument 参数) 在 Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.Resolve(ServiceCallSite callSite,ServiceProviderEngineScope 范围) 在 Microsoft.Extensions.DependencyInjection.ServiceLookup.DynamicServiceProviderEngine.c__DisplayClass1_0.b__0(ServiceProviderEngineScope 范围) 在 Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceProviderEngine.GetService(类型 serviceType,ServiceProviderEngineScope serviceProviderEngineScope) 在 Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceProviderEngineScope.GetService(类型 serviceType) 在 Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService(IServiceProvider 提供程序,类型 serviceType) 在 Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService[T](IServiceProvider 提供程序) 在 Microsoft.EntityFrameworkCore.DbContext.get_DbContextDependencies() 在 Microsoft.EntityFrameworkCore.DbContext.get_InternalServiceProvider() 在 Microsoft.EntityFrameworkCore.DbContext.get_DbContextDependencies() 在 Microsoft.EntityFrameworkCore.DbContext.get_Model() 在 Microsoft.EntityFrameworkCore.Internal.InternalDbSet1.get_EntityType() at Microsoft.EntityFrameworkCore.Internal.InternalDbSet1.CheckState() 在 Microsoft.EntityFrameworkCore.Internal.InternalDbSet1.get_EntityQueryable() at Microsoft.EntityFrameworkCore.Internal.InternalDbSet1.System.Linq.IQueryable.get_Provider() 在 System.Linq.Queryable.Where[TSource](IQueryable1 source, Expression1 谓词) 在 ORMTest.Program.Main(String[] args) 在 C:\Projects...\Program.cs:line 14

根据错误,这里的参数'methodInfo'为null,因此会导致抛出此异常,但我不明白这里有什么问题。 如何在我的项目中正确定义此函数以便我可以调用它? 是否有另一种(更简单的)方法来调用该函数?

【问题讨论】:

    标签: c# oracle entity-framework-core


    【解决方案1】:

    GetMethod 的第二个参数是“一个 System.Type 对象数组,表示要获取的方法的参数的数量、顺序和类型”。

    modelBuilder.HasDbFunction(typeof(ModelContext).GetMethod(nameof(FncHourlyData), new[] { typeof(string), typeof(DateTime) })).HasName("fnc_hourly_data");
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-30
      • 2018-12-19
      • 2020-03-01
      • 1970-01-01
      • 2016-06-30
      • 2022-12-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多