【问题标题】:Azure Functions, Entity Framework and Oracle DB - basic POC failsAzure Functions、Entity Framework 和 Oracle DB - 基本 POC 失败
【发布时间】:2018-12-18 05:55:26
【问题描述】:

我在实现基本概念验证工作时遇到了很多麻烦,其中我通过 Entity Framework (6.2) 通过 Azure Functions 访问 Oracle DB (11g)。

先决条件: 已安装 ODT For Visual Studio 2017,以及 Azure Functions CLI/Core Tools。下面提到的所有内容都完全通过 Visual Studio 2017 完成,而不是通过 Azure 门户。

第 1 次:

使用 Azure Functions 模板创建了一个新项目。

已安装 NuGet 包 EntityFramework (6.2.0)、Oracle.ManagedDataAccess (12.2.1100) 和 Oracle.ManagedDataAccess.EntityFramework (12.2.1100)。注意:使用 Azure Functions 模板在项目中安装 NuGet 包时,这些包将添加到 Dependencies -> NuGet 下,而不是 References 下。

向项目添加了 ADO.NET 实体数据模型。

问题:设置我的连接字符串后,选择Entity Framework 6.x不可用,报错如下:

与最新版本兼容的实体框架数据库提供程序 找不到您的数据的实体框架版本 联系。如果您已经安装了兼容的提供程序, 确保在执行此操作之前已重建项目。 否则,退出此向导,安装兼容的提供程序,然后 在执行此操作之前重建您的项目。

作为最简单的解决方法,我尝试继续使用 EF5,但它在创建 DB 模型时抛出异常(在选择要包含在模型中的对象,包括一些存储过程之后)。

采取 2:

如上创建项目并安装 NuGet 包。

创建类库项目以促进 Oracle 交互。

在类库项目中安装了与上面相同的 NuGet 包。

在类库项目中添加了 ADO.NET 实体数据模型,并在数据库模型中添加了一些数据库对象。还为特定连接字符串的模型添加了自定义构造函数,因为在 Azure Functions 中管理连接字符串是一组单独的难题,我将在稍后处理。

向类库项目添加了一个简单的包装方法,该方法从数据库模型中调用存储过程:

public static string NameByEmpNo(int empNo)
{
    string result;
    MyEntities entities = new MyEntities("metadata=res://*/MyEntities.csdl|res://*/MyEntities.ssdl|res://*/MyEntities.msl;provider=Oracle.ManagedDataAccess.Client;provider connection string='DATA SOURCE=127.0.0.1:1521/ORCL;PASSWORD=tiger;USER ID=SCOTT'");
    ObjectParameter name = new ObjectParameter("o_empname", typeof(string));
    entities.GET_EMP_NAME_PROC(empNo, name);
    result = (string)name.Value;
    return result;
}

在 Azure Functions 项目中添加了对类库的引用。

添加了调用 NameByEmpNo 的函数:

    [FunctionName("GetNameByEmpNo")]
    public static async Task<HttpResponseMessage> GetNameByEmpNo([HttpTrigger(AuthorizationLevel.Function, "get", Route = null)]HttpRequestMessage req, TraceWriter log)
    {
        int empNo = Int32.Parse(req.GetQueryNameValuePairs()
            .FirstOrDefault(q => string.Compare(q.Key, "empno", true) == 0)
            .Value);
        string empName = ScottAccess.NameByEmpNo(empNo);
        return req.CreateResponse(HttpStatusCode.OK, "Employee name: " + empName);
    }

问题:在运行时,调用函数失败并出现此错误 消息:

执行函数时出现异常:GetNameByEmpNo -> ADO.NET 具有不变名称“Oracle.ManagedDataAccess.Client”的提供程序是 未在机器或应用程序配置文件中注册,或 无法加载。有关详细信息,请参阅内部异常。 -> 无法 找到请求的 .Net Framework 数据提供程序。它可能不是 已安装。

额外信息:我的类库在通过控制台应用程序调用时可以完美运行。此外,在调用不使用我的类库的函数时,我的 Azure Functions 应用也能完美运行...

我被难住了。有没有人有让这种技术组合一起工作的经验,并且可以提供一些关于我哪里出错/提供使基本连接正常工作的步骤的见解?

【问题讨论】:

    标签: visual-studio entity-framework oracle11g azure-functions ef-database-first


    【解决方案1】:

    Azure Functions 中的实体框架将提供程序默认为 System.Data.SqlClient,因此 SQL 连接无需任何配置更改即可工作,但这意味着您必须为 Oracle 连接做一些特殊的事情。问题似乎来自 Oracle.ManagedDataAccess.Client 库假定在项目的 App.Config 或 Web.Config 文件中可用的配置值,这些值在您安装 Oracle.ManagedDataAcess.EntityFramework Nuget 包时插入。 Azure Functions 没有配置文件,我无法找到任何方法在设置 json 文件中指定 Oracle 提供程序。

    我在这个post找到了解决方案

    它建议绕过此机制并为 Oracle 创建一个 DbConfiguration,然后使用 DbConfigurationType 告诉 DbContext 您正在使用哪种配置。

    public class OracleDbConfiguration : DbConfiguration
    {
        public OracleDbConfiguration()
        {
            SetDefaultConnectionFactory(new OracleConnectionFactory());
            SetProviderServices("Oracle.ManagedDataAccess.Client", EFOracleProviderServices.Instance);
            SetProviderFactory("Oracle.ManagedDataAccess.Client", new OracleClientFactory());
        }
    }
    
    [DbConfigurationType(typeof(OracleDbConfiguration))]
    public partial class MyEntities : IGISContext
    {
        //Expose Connection String Constructor
        public MyEntities(string connectionString, int commandTimeoutInSeconds = 30) : base(connectionString)
        {
            this.Database.CommandTimeout = commandTimeoutInSeconds;
        }
    }
    

    注意:我使用 EF 6 Database First 来生成我的 EDMX;这里的 MyEntities 是一个分部类,用于提供接受连接字符串的构造函数。

    oracle 连接将使用指定的 DbConfiguration 类,并且任何 SQL 数据库连接将继续使用默认值。

    我的解决方案是使用 Nuget 包:

    • EntityFramework 6.2.0
    • Oracle.ManagedDataAccess 12.2.1100
    • Oracle.ManagedDataAccess.EntityFramework 12.2.1100

    【讨论】:

      猜你喜欢
      • 2015-07-25
      • 2018-10-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多