Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 实体框架中存储函数的使用_C#_.net_Oracle_Entity Framework_Stored Functions - Fatal编程技术网

C# 实体框架中存储函数的使用

C# 实体框架中存储函数的使用,c#,.net,oracle,entity-framework,stored-functions,C#,.net,Oracle,Entity Framework,Stored Functions,我有一个旧的OracleDB,我正试图在entityframework4.1应用程序中使用它。 我已经了解到oracle对EF的巨大限制-除非创建一个包装过程,否则不能使用EF调用oracle存储的函数 我的数据库中存储了数千个函数,还有其他解决方法吗? 是否喜欢使用原始Context.SqlQuery() 到目前为止我还没有找到解决办法 Oracle开发人员可以通过实体框架函数导入(用于显式调用过程)和存储过程映射(在实体插入、更新和删除操作中自动调用)在实体框架内利用PL/SQL存储过程

我有一个旧的
Oracle
DB,我正试图在
entityframework4.1
应用程序中使用它。
我已经了解到oracle对EF的巨大限制-除非创建一个包装过程,否则不能使用EF调用oracle存储的函数

我的数据库中存储了数千个函数,还有其他解决方法吗?
是否喜欢使用原始
Context.SqlQuery()

到目前为止我还没有找到解决办法


Oracle开发人员可以通过实体框架函数导入(用于显式调用过程)和存储过程映射(在实体插入、更新和删除操作中自动调用)在实体框架内利用PL/SQL存储过程(有限制)

实体框架只能调用Oracle存储过程,而不能调用存储函数。(如果将Oracle存储函数包装在存储过程中,该存储过程使用OUT参数作为存储函数返回值,则可以使用Oracle存储函数。)


如果您首先使用EntityFramework4.1代码,可以尝试使用。 例如,对于此函数

CREATE OR REPLACE FUNCTION USERNAME_CTX.FUNCTION1 (param number)
 RETURN number
AS
BEGIN
 return param + 1;
END;
您可以使用以下代码:

using (var ctx = new Model()) {
   var result =  ctx.Database.SqlQuery<int>("select username_ctx.FUNCTION1(:p0) from dual",1).FirstOrDefault();
     using (var ctx = new Model()) {
       var firstParam = new Devart.Data.Oracle.OracleParameter("p0", OracleDbType.Number, 1, ParameterDirection.Input);
       var secondParam = new Devart.Data.Oracle.OracleParameter("p1", OracleDbType.Number, ParameterDirection.Output);
       var thirdParam = new Devart.Data.Oracle.OracleParameter("p2", OracleDbType.VarChar, ParameterDirection.Output);
       var resultParam = new Devart.Data.Oracle.OracleParameter("res", OracleDbType.Number, 1, ParameterDirection.Output);
       ctx.Database.ExecuteSqlCommand(@"begin  :res := username_ctx.FUNCTION2(:p0, :p1, :p2);  end;", firstParam, secondParam, thirdParam, resultParam);
       Console.WriteLine("Return value: {0}; int_param: {1}; str_param: '{2}'", resultParam.Value, secondParam.Value, thirdParam.Value);
 } 
您可以使用以下代码:

   using (var ctx = new Model()) {
       var firstParam = new Devart.Data.Oracle.OracleParameter("p0", OracleDbType.Number, 1, ParameterDirection.Input);
       var secondParam = new Devart.Data.Oracle.OracleParameter("p1", OracleDbType.Number, ParameterDirection.Output);
       var thirdParam = new Devart.Data.Oracle.OracleParameter("p2", OracleDbType.VarChar, ParameterDirection.Output);
       var cursorParam = new Devart.Data.Oracle.OracleParameter("cursor_param", OracleDbType.Cursor, ParameterDirection.Output);

       var result = ctx.Database.SqlQuery<int>(
        @"declare
             res number;  
        begin
             res := username_ctx.FUNCTION2(:p0, :p1, :p2);
             open :cursor_param for select res from dual;
        end;",  firstParam, secondParam, thirdParam, cursorParam).FirstOrDefault();

       Console.WriteLine("Return value: {0}; int_param: {1}; str_param: '{2}'", result, secondParam.Value, thirdParam.Value);
      }

+1谢谢,但是如果函数有
OUT
参数,则它将不起作用<代码>:(请注意,答案已经修改过一次,名称空间
Devart.Data.Oracle
位于何处?正如我前面提到的,只有在使用dotConnect for Oracle provider时,才能使用Devart.Data.Oracle名称空间。我们如何使用Entity Framework 6和
Devart.Data.Oracle
p调用
Oracle package
流浪者?
     using (var ctx = new Model()) {
       var firstParam = new Devart.Data.Oracle.OracleParameter("p0", OracleDbType.Number, 1, ParameterDirection.Input);
       var secondParam = new Devart.Data.Oracle.OracleParameter("p1", OracleDbType.Number, ParameterDirection.Output);
       var thirdParam = new Devart.Data.Oracle.OracleParameter("p2", OracleDbType.VarChar, ParameterDirection.Output);
       var resultParam = new Devart.Data.Oracle.OracleParameter("res", OracleDbType.Number, 1, ParameterDirection.Output);
       ctx.Database.ExecuteSqlCommand(@"begin  :res := username_ctx.FUNCTION2(:p0, :p1, :p2);  end;", firstParam, secondParam, thirdParam, resultParam);
       Console.WriteLine("Return value: {0}; int_param: {1}; str_param: '{2}'", resultParam.Value, secondParam.Value, thirdParam.Value);
 }