加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 在实体框架中使用存储的函数

发布时间:2020-12-15 08:40:24 所属栏目:百科 来源:网络整理
导读:我有一个旧的Oracle数据库,我试图在EntityFramework 4.1应用程序中使用它. 我已经读过oracle与EF有很大的限制 – 你不能用EF调用Oracle存储的函数,除非你创建一个包装过程. 我的数据库中有成千上万的存储函数,有没有其他方法可以解决它? 喜欢使用原始Contex
我有一个旧的Oracle数据库,我试图在EntityFramework 4.1应用程序中使用它.
我已经读过oracle与EF有很大的限制 – 你不能用EF调用Oracle存储的函数,除非你创建一个包装过程.

我的数据库中有成千上万的存储函数,有没有其他方法可以解决它?
喜欢使用原始Context.SqlQuery()?

到目前为止,我找不到解决方案……

Oracle docs:

Oracle developers can leverage PL/SQL stored procedures,with limitations,within the entity framework via Entity Framework Function Imports (used to call the procedures explicitly) and stored procedure mappings (which are automatically called for entity Insert,Update,and Delete operations).

Only Oracle stored procedures can be called by Entity Framework,not stored functions. (Oracle stored functions can be used if they are wrapped inside of a stored procedure that uses an OUT parameter for the stored function return value.)

解决方法

如果您正在使用Entity Framework 4.1 Code First,则可以尝试使用 Database.SqlQuery Method.
例如,对于此功能
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();

}

编辑:

请注意dotConnect for Oracle的此解决方案(可能对实现类似的ODP.NET解决方案很有用)

对于这个功能:

CREATE OR REPLACE FUNCTION USERNAME_CTX.FUNCTION2 (param number,int_param out number,str_param out varchar2)
  RETURN number
AS
BEGIN
   int_param := param + 2;
   str_param := 'value';
   return param + 1;
END;

您可以使用以下代码:

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",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);
      }

编辑2

或使用此代码:

using (var ctx = new Model()) {
       var firstParam = new Devart.Data.Oracle.OracleParameter("p0",ParameterDirection.Output);
       var resultParam = new Devart.Data.Oracle.OracleParameter("res",ParameterDirection.Output);
       ctx.Database.ExecuteSqlCommand(@"begin  :res := username_ctx.FUNCTION2(:p0,:p2);  end;",resultParam);
       Console.WriteLine("Return value: {0}; int_param: {1}; str_param: '{2}'",resultParam.Value,thirdParam.Value);
 }

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读