簡體   English   中英

在實體框架中使用存儲的函數

[英]Usage of stored functions in entity framework

我有一個舊的Oracle數據庫,我試圖在EntityFramework 4.1應用程序中使用它。
我已經讀過oracle與EF有很大的限制 - 你不能用EF調用Oracle存儲的函數 ,除非你創建一個包裝過程

我的數據庫中有成千上萬的存儲函數,有沒有其他方法可以解決它?
喜歡使用原始Context.SqlQuery()

到目前為止,我找不到解決方案......


Oracle文檔:

Oracle開發人員可以通過Entity Framework Function Imports(用於顯式調用過程)和存儲過程映射(實體Insert,Update和Delete操作自動調用)在實體框架內利用PL / SQL存儲過程 (有限制)。

實體框架只能調用Oracle存儲過程,而不能存儲函數。 (如果Oracle存儲函數包含在對存儲函數返回值使用OUT參數的存儲過程中,則可以使用它們。)

如果您正在使用Entity Framework 4.1 Code First,則可以嘗試使用Database.SqlQuery方法 例如,對於此功能

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

編輯2

或使用此代碼:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM