(使用Visual Studio 2013)如何使用Entity Framework在oracle包中调用存储过程?

时间:2014-11-26 07:54:37

标签: c# oracle entity-framework

我尝试使用带有ADO.NET实体数据模型的EF5添加放置在包内的oracle过程,并且不会导入任何内容。我看不到任何程序。

我正在使用ODAC 12c第3版 - > Oracle Data Provide。

我可以导入在包外创建的过程。

我们的开发标准是使用oracle包来定义过程。我现在正在使用Entity Framework从VS2008迁移到VS2013。

请提供建议并提供解决此问题的可能解决方案。非常感谢。

2 个答案:

答案 0 :(得分:0)

这是我在最近的一个项目中做过类似的事情。请注意,我使用DevArt而不是ODAC,但也许你会在这里找到一些灵感来解决你的问题。

我首先创建了一个包含该函数所需的所有参数的类:

public class MyFunctionParameter
{
    public DateTime? MyDateTime { get; set; }

    public string Source { get; set; }
}

此类还包含ToOracleParameters()方法。请注意OracleParameter is from DevArt

public List<OracleParameter> ToOracleParameters()
{
    return new List<OracleParameter>
    {
        new OracleParameter("My_Date_Time", OracleDbType.Date, MyDateTime, ParameterDirection.Input),
        new OracleParameter("Source", OracleDbType.VarChar, Source, ParameterDirection.Input),
        new OracleParameter("ID", OracleDbType.Number, ParameterDirection.Output)
    };
}

在我的方法中,我然后使用这个类:

var parameters = parameter.ToOracleParameters();
var inParameterList = string.Join(", ", 
    parameters.Where(x => x.Direction == ParameterDirection.Input)
        .Select(x => ":" + x.ParameterName));
var outParameter = parameters.Single(x => x.Direction == ParameterDirection.Output);
var sql = string.Format("BEGIN :{0} := MY_ORACLE_FUNCTION({1}); end;", 
    outParameter.ParameterName, inParameterList);

DbContext.Database.SqlQuery<object>(sql, parameters.Cast<object>().ToArray()).SingleOrDefault();

答案 1 :(得分:0)

尝试执行以下操作:

  1. 在服务器资源管理器 - &gt;数据连接中,您将看到为生成模型所做的连接。您可以从那里修改连接。有一个名为Filter的选项卡,您可以在其中设置可以看到的许多对象。例如,您可以获取公共同义词和显示的集合(包,视图,表等)

  2. 我不是Oracle专家,但是,您是否可以为包内的过程创建公共同义词?可能它会起作用

  3. 如果找不到解决方案,可以到这里: https://community.oracle.com/community/database/developer-tools/windows_and_.net

  4. 一些开发了Oracle实体框架的人可能会帮助你。

    希望它有所帮助。

    此致