2012-10-09 14 views
6

मेरे पास पुराना Oracle डीबी है जिसे मैं EntityFramework 4.1 एप्लिकेशन के भीतर उपयोग करने का प्रयास कर रहा हूं।
मैंने ओएकल के साथ बड़ी सीमा के बारे में पढ़ा है- आप ओरेकल को फ़ंक्शन को ईएफ के साथ कॉल नहीं कर सकते हैं जब तक कि आप एक रैपिंग प्रक्रिया नहीं बनाते।इकाई ढांचे में संग्रहीत कार्यों का उपयोग

मुझे अपने डीबी में हजारों संग्रहीत कार्य मिल गए हैं, क्या इसे हल करने का कोई और तरीका है?
कच्चे Context.SqlQuery() का उपयोग करने की तरह?

अब तक मैं इसके लिए एक समाधान नहीं मिला ...


Oracle docs:

ओरेकल डेवलपर्स का लाभ उठा सकें PL/SQL प्रक्रियाओं संग्रहीत, सीमाओं के साथ, यूनिट के भीतर एंटिटी फ्रेमवर्क फ़ंक्शन आयात (स्पष्ट रूप से प्रक्रियाओं को कॉल करने के लिए उपयोग किया जाता है) के माध्यम से ढांचा और संग्रहीत प्रक्रिया मैपिंग (जिसे स्वचालित रूप से इकाई सम्मिलित करें, अपडेट करें और हटाएं ऑपरेशन के लिए बुलाया जाता है)।

केवल ओरेकल संग्रहीत प्रक्रियाओं को एंटीटी फ्रेमवर्क द्वारा संग्रहीत किया जा सकता है, संग्रहीत कार्यों में नहीं। (Oracle संग्रहीत फ़ंक्शन अगर वे एक संग्रहीत प्रक्रिया संग्रहीत समारोह वापसी मान के लिए एक बाहर पैरामीटर का उपयोग करता है के अंदर लिपटे रहे हैं इस्तेमाल किया जा सकता।)

उत्तर

6

आप के साथ इकाई की रूपरेखा 4.1 संहिता सबसे पहले काम कर रहे हैं, तो आप कोशिश कर सकते हैं 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 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); 
} 
+0

+1 धन्यवाद , लेकिन अगर यह काम नहीं करेगा फ़ंक्शन में 'आउट' पैरामीटर है। ': (' – gdoron

+0

मैंने उत्तर – Devart

+0

संपादित किया है, कृपया ध्यान दें कि उत्तर एक बार फिर से संशोधित किया गया है – Devart

संबंधित मुद्दे