gdo*_*ica 6 .net c# oracle entity-framework stored-functions
我有一个旧的Oracle
数据库,我正在尝试在EntityFramework 4.1
应用程序中使用.
我已经读过oracle与EF有很大的限制 - 你不能用EF 调用Oracle存储的函数,除非你创建一个包装过程.
我的数据库中有成千上万的存储函数,有没有其他方法可以解决它?
喜欢用raw Context.SqlQuery()
?
到目前为止,我找不到解决方案......
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;
Run Code Online (Sandbox Code Playgroud)
你可以使用这段代码:
using (var ctx = new Model()) {
var result = ctx.Database.SqlQuery<int>("select username_ctx.FUNCTION1(:p0) from dual",1).FirstOrDefault();
Run Code Online (Sandbox Code Playgroud)
}
编辑:
请注意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;
Run Code Online (Sandbox Code Playgroud)
您可以使用以下代码:
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);
}
Run Code Online (Sandbox Code Playgroud)
编辑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);
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
8580 次 |
最近记录: |