使用实体框架从oracle包中导入过程

本文关键字:包中 导入 过程 oracle 实体 框架 | 更新日期: 2023-09-27 18:04:19

CREATE OR REPLACE PACKAGE johns_test_pkg AS
  PROCEDURE test(some_parameter IN  NUMBER,
                 success_id     OUT NUMBER);
  PROCEDURE test_no_out_parameter(some_parameter IN NUMBER);
  PROCEDURE test_no_in_parameter(success_id OUT NUMBER);
END johns_test_pkg;
/
CREATE OR REPLACE PACKAGE BODY johns_test_pkg AS
  --
  PROCEDURE test(some_parameter IN  NUMBER,
                 success_id     OUT NUMBER)
  IS
    v_app_user_session_id INTEGER;
    BEGIN
      v_app_user_session_id := 1 + some_parameter;
      success_id := v_app_user_session_id;
    END;
  --
  PROCEDURE test_no_out_parameter(some_parameter IN NUMBER)
  IS
    v_app_user_session_id INTEGER;
    BEGIN
      v_app_user_session_id := 1 + some_parameter;
    END;
  --
  PROCEDURE test_no_in_parameter(success_id OUT NUMBER)
  IS    
    v_app_user_session_id INTEGER;
    BEGIN
      v_app_user_session_id := 1 + 10;
      success_id := v_app_user_session_id;
    END;
END johns_test_pkg;
/

给定上面简单的Oracle包,其中包含三个过程。我试图使用实体框架5将这些过程添加到我的模型中,但无济于事。我已经能够添加一些不在包中的Oracle过程。

我一直在阅读这个问题和其他一些类似的问题,如how-to-call-oracle-function-with-return-value-using- link -to-entities,并从选择的答案中继续阅读。这个人说IN OUT参数或OUT参数应该工作,但我的三个参数都没有导入。我期望test_no_in_parameter过程会被加载?

是否可以在包下加载过程?

使用实体框架从oracle包中导入过程

在edmx模型中右键单击"Update model from Database"取消勾选"将选定的存储过程和函数导入实体模型",从包中选择过程并更新。(它的工作原理)然后在"模型浏览器"下的"模型"。"存储'存储过程/函数"你将从包中看到你的过程(最后)。然后将它们映射到"函数导入"中。

我不明白为什么取消选中导入存储过程可以工作,但是它可以。

如果EF 5在从Oracle包导入过程时遇到问题,有两种可能的解决方法。

  • 调用匿名块中的任意过程:

    var param1 = new OracleParameter("p_param_in", OracleDbType.Number, 123,  ParameterDirection.Input);
    var param2 = new OracleParameter("p_param_out", OracleDbType.Number, ParameterDirection.Output);
    var param2_val = db.Database.SqlQuery<YourTestEntity>(
                   "BEGIN johns_test_pkg.test(:p_param_in, :p_param_out); END;" 
                   , param1).Single();
    
  • 为包中每个需要的过程创建一个包装存储过程。我认为这是一种合适的方式来满足EF和保持你的代码健壮(没有肤浅的快速匿名块)。唯一的问题是,考虑到Oracle有30个符号的名称限制,您需要为包装器找到良好的命名风格。

    CREATE OR REPLACE my_wrap_prefix__test(some_parameter IN  NUMBER,
                                           success_id     OUT NUMBER)
    IS BEGIN
        johns_test_pkg.test(some_parameter, success_id);
    END;