2012-10-09 21 views
6

Ich habe eine alte Oracle DB, die ich versuche, innerhalb EntityFramework 4.1 Anwendung zu verwenden.
Ich habe gelesen, über die große Einschränkung, die Oracle mit EF hat - Sie können nicht gespeichert Oracle Funktion mit EF, es sei denn, Sie erstellen eine Verpackung Verfahren.Verwendung von gespeicherten Funktionen im Entity-Framework

Ich habe Tausende von gespeicherten Funktionen in meiner DB, gibt es eine andere Möglichkeit, es zu lösen?
Wie mit rohen Context.SqlQuery()?

Bisher konnte ich keine Lösung für sie finden ...


Oracle docs:

Oracle-Entwickler können PL/SQL Verfahren, mit Einschränkungen gespeichert nutzen, innerhalb des Unternehmens Framework über Entity Framework Funktion Importe (zum expliziten Aufruf der Prozeduren) und gespeicherte Prozedurzuordnungen (die automatisch für die Operationen Einfügen, Aktualisieren und Löschen von Entitäten aufgerufen werden).

Nur Oracle gespeicherte Prozeduren können von Entity Framework aufgerufen werden, nicht gespeicherte Funktionen. (Oracle gespeicherten Funktionen können verwendet werden, wenn sie innerhalb einer gespeicherten Prozedur eingewickelt werden, die für die gespeicherte Funktion Rückgabewert einen OUT-Parameter verwendet.)

Antwort

6

Wenn Sie mit Entity Framework 4.1-Code Zunächst arbeiten, können Sie versuchen, Verwenden Sie die Database.SqlQuery Method. Zum Beispiel für diese Funktion

CREATE OR REPLACE FUNCTION USERNAME_CTX.FUNCTION1 (param number) 
RETURN number 
AS 
BEGIN 
return param + 1; 
END; 

Sie diesen Code verwenden können:

using (var ctx = new Model()) { 
    var result = ctx.Database.SqlQuery<int>("select username_ctx.FUNCTION1(:p0) from dual",1).FirstOrDefault(); 

}

EDITED:

Bitte beachten Sie, diese Lösung für dotConnect für Oracle (vielleicht Es wird nützlich sein für die Implementierung einer ähnlichen Lösung für ODP.NET)

Für diese Funktion:

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

EDITED

oder diesen Code verwenden: 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); 
} 
+0

+1 Dank

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; 

Sie den folgenden Code verwenden können , aber es wird nicht funktionieren, wenn die Die Funktion hat einen OUT-Parameter. ': (' – gdoron

+0

Ich habe die Antwort bearbeitet – Devart

+0

Bitte beachten Sie, dass die Antwort noch einmal geändert wurde – Devart

Verwandte Themen