c# – 在实体框架中使用存储的函数
我有一个旧的Oracle数据库,我试图在EntityFramework 4.1应用程序中使用它.
我已经读过oracle与EF有很大的限制 – 你不能用EF调用Oracle存储的函数,除非你创建一个包装过程. 我的数据库中有成千上万的存储函数,有没有其他方法可以解决它? 到目前为止,我找不到解决方案…… Oracle docs:
解决方法
如果您正在使用Entity Framework 4.1 Code First,则可以尝试使用
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 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",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",ParameterDirection.Output); var resultParam = new Devart.Data.Oracle.OracleParameter("res",ParameterDirection.Output); ctx.Database.ExecuteSqlCommand(@"begin :res := username_ctx.FUNCTION2(:p0,:p2); end;",resultParam); Console.WriteLine("Return value: {0}; int_param: {1}; str_param: '{2}'",resultParam.Value,thirdParam.Value); } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |