C# 实体框架中存储函数的使用
我有一个旧的C# 实体框架中存储函数的使用,c#,.net,oracle,entity-framework,stored-functions,C#,.net,Oracle,Entity Framework,Stored Functions,我有一个旧的OracleDB,我正试图在entityframework4.1应用程序中使用它。 我已经了解到oracle对EF的巨大限制-除非创建一个包装过程,否则不能使用EF调用oracle存储的函数 我的数据库中存储了数千个函数,还有其他解决方法吗? 是否喜欢使用原始Context.SqlQuery() 到目前为止我还没有找到解决办法 Oracle开发人员可以通过实体框架函数导入(用于显式调用过程)和存储过程映射(在实体插入、更新和删除操作中自动调用)在实体框架内利用PL/SQL存储过程
Oracle
DB,我正试图在entityframework4.1
应用程序中使用它。我已经了解到oracle对EF的巨大限制-除非创建一个包装过程,否则不能使用EF调用oracle存储的函数 我的数据库中存储了数千个函数,还有其他解决方法吗?
是否喜欢使用原始
Context.SqlQuery()
到目前为止我还没有找到解决办法
Oracle开发人员可以通过实体框架函数导入(用于显式调用过程)和存储过程映射(在实体插入、更新和删除操作中自动调用)在实体框架内利用PL/SQL存储过程(有限制) 实体框架只能调用Oracle存储过程,而不能调用存储函数。(如果将Oracle存储函数包装在存储过程中,该存储过程使用OUT参数作为存储函数返回值,则可以使用Oracle存储函数。)
如果您首先使用EntityFramework4.1代码,可以尝试使用。 例如,对于此函数
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();
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);
}
您可以使用以下代码:
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);
}
+1谢谢,但是如果函数有
OUT
参数,则它将不起作用<代码>:(请注意,答案已经修改过一次,名称空间Devart.Data.Oracle
位于何处?正如我前面提到的,只有在使用dotConnect for Oracle provider时,才能使用Devart.Data.Oracle名称空间。我们如何使用Entity Framework 6和Devart.Data.Oracle
p调用Oracle package
流浪者?
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);
}