【问题标题】:Azure Functions with Entity Framework带有实体框架的 Azure Functions
【发布时间】:2017-04-01 23:15:02
【问题描述】:

我使用project.json 导入EntityFramework 6.1.3 NuGet 包。我可以确认 NuGet 包已在我的函数应用中成功恢复。

根据document,我可以直接使用EntityFramework。但是,我不断收到如下错误:

ManualTriggerCSharp1:无法加载文件或程序集“EntityFramework,Version=6.0.0.0,Culture=neutral,PublicKeyToken=b77a5c561934e089”或其依赖项之一。系统找不到指定的文件。

我的函数似乎无法正确加载 EntityFramework dll。即使我将EntityFramework.dllEntityFramework.SqlServer.dll 都复制到bin 目录中,它仍然会报同样的异常。

我错过了什么?

更新

这是我的project.json 文件:

{
  "frameworks": {
    "net46":{
      "dependencies": {
        "Autofac": "4.2.0",
        "AutoMapper": "5.1.1",
        "EntityFramework": "6.1.3",
        "Newtonsoft.Json": "9.0.1"
      }
    }
   }
}

正如我上面提到的,这不起作用。所以,我手动将EntityFramework.dllEntityFramework.SqlServer.dll 复制到bin 目录中,并在run.csx 文件中引用它,例如:

#r "EntityFramework.dll"
#r "EntityFramework.SqlServer.dll"

但还是在抱怨。整行日志信息是:

2016-11-18T20:22:46.296 执行函数时出现异常:Functions.ManualTriggerCSharp1。 mscorlib:调用的目标已引发异常。 ManualTriggerCSharp1:无法加载文件或程序集“EntityFramework,Version=6.0.0.0,Culture=neutral,PublicKeyToken=b77a5c561934e089”或其依赖项之一。系统找不到指定的文件。

更新 2

这是我的完整功能代码:

#r "Tournaments.EntityModels.dll"

using System;
using System.Configuration;

using Tournaments.EntityModels;

public static void Run(string input, TraceWriter log)
{
    log.Info($"C# manually triggered function called with input: {input}");

    var connString = ConfigurationManager.ConnectionStrings["TournamentDbContext"].ConnectionString;
    var dbContext = new TournamentDbContext(connString);
    var numberOfPlayers = dbContext.Players.ToList().Count;

    log.Info($"Number of Players: {numberOfPlayers}");
}

注意Tournaments.EntityModels.dll 是实际的数据库实体模型。这是我的project.json

{
  "frameworks": {
    "net46": {
      "dependencies": {
        "EntityFramework": "6.1.3"
      }
    }
  }
}

我能够编译该函数。完全没有问题。问题发生在运行时。当我运行这个函数时,我得到了错误:

2016-11-19T00:52:40.818 函数已启动(Id=c03af3f2-38f5-4df9-9bc5-b5932c365c04)

2016-11-19T00:52:40.818 功能完成(失败,Id=c03af3f2-38f5-4df9-9bc5-b5932c365c04)

2016-11-19T00:52:40.836 执行函数时出现异常:Functions.ManualTriggerCSharp3。 mscorlib:调用的目标已引发异常。 ManualTriggerCSharp3:无法加载文件或程序集“EntityFramework,Version=6.0.0.0,Culture=neutral,PublicKeyToken=b77a5c561934e089”或其依赖项之一。系统找不到指定的文件。

我查看了 KUDU 中的日志,并从日志流中找到了这个:

2016-11-19T01:00:25.454 执行:'Functions.ManualTriggerCSharp3' - 原因:'此函数是通过主机 API 以编程方式调用的。'

2016-11-19T01:00:25.649 函数已启动(Id=b18b45a7-83a8-453e-a337-955e6a4a5117)

2016-11-19T01:00:25.649 功能完成(失败,Id=b18b45a7-83a8-453e-a337-955e6a4a5117)

2016-11-19T01:00:25.649 发生 ScriptHost 错误

2016-11-19T01:00:25.649 无法加载文件或程序集“EntityFramework,Version=6.0.0.0,Culture=neutral,PublicKeyToken=b77a5c561934e089”或其依赖项之一。系统找不到指定的文件。

2016-11-19T01:00:25.649 函数已启动(Id=b18b45a7-83a8-453e-a337-955e6a4a5117)

2016-11-19T01:00:25.649 功能完成(失败,Id=b18b45a7-83a8-453e-a337-955e6a4a5117)

2016-11-19T01:00:25.665 执行函数时出现异常:Functions.ManualTriggerCSharp3。 mscorlib:调用的目标已引发异常。 ManualTriggerCSharp3:无法加载文件或程序集“EntityFramework,Version=6.0.0.0,Culture=neutral,PublicKeyToken=b77a5c561934e089”或其依赖项之一。系统找不到指定的文件。

2016-11-19T01:00:25.665 执行函数时出现异常:Functions.ManualTriggerCSharp3。 mscorlib:调用的目标已引发异常。 ManualTriggerCSharp3:无法加载文件或程序集“EntityFramework,Version=6.0.0.0,Culture=neutral,PublicKeyToken=b77a5c561934e089”或其依赖项之一。系统找不到指定的文件。

2016-11-19T01:00:25.681 执行函数时出现异常:Functions.ManualTriggerCSharp3

2016-11-19T01:00:25.696 无法加载文件或程序集“EntityFramework,Version=6.0.0.0,Culture=neutral,PublicKeyToken=b77a5c561934e089”或其依赖项之一。系统找不到指定的文件。

2016-11-19T01:00:25.696 执行:'Functions.ManualTriggerCSharp3'(失败)

2016-11-19T01:00:25.696 无法加载文件或程序集“EntityFramework,Version=6.0.0.0,Culture=neutral,PublicKeyToken=b77a5c561934e089”或其依赖项之一。系统找不到指定的文件。

2016-11-19T01:00:25.696 函数有错误。有关详细信息,请参阅 Azure WebJobs SDK 仪表板。实例 ID 为 'b18b45a7-83a8-453e-a337-955e6a4a5117'

2016-11-19T01:00:25.696 无法加载文件或程序集“EntityFramework,Version=6.0.0.0,Culture=neutral,PublicKeyToken=b77a5c561934e089”或其依赖项之一。系统找不到指定的文件。

这是来自函数日志的堆栈跟踪消息:

...obs.Script.Description.FunctionInvokerBase.d__23.MoveNext()

--- 从先前抛出异常的位置结束堆栈跟踪---

在 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务)

在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务)

在 Microsoft.Azure.WebJobs.Host.Executors.FunctionInvoker`1.d__0.MoveNext()

--- 从先前抛出异常的位置结束堆栈跟踪---

在 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务)

在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务)

在 Microsoft.Azure.WebJobs.Host.Executors.FunctionExecutor.d__53.MoveNext()

--- 从先前抛出异常的位置结束堆栈跟踪---

在 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务)

在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务)

在 Microsoft.Azure.WebJobs.Host.Executors.FunctionExecutor.d__3b.MoveNext()

--- 从先前抛出异常的位置结束堆栈跟踪---

在 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务)

在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务)

在 Microsoft.Azure.WebJobs.Host.Executors.FunctionExecutor.d__36.MoveNext()

--- 从先前抛出异常的位置结束堆栈跟踪---

在 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务)

在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务)

在 System.Runtime.CompilerServices.TaskAwaiter.ValidateEnd(任务任务)

在 Microsoft.Azure.WebJobs.Host.Executors.FunctionExecutor.d__1a.MoveNext()

---内部异常堆栈跟踪结束---

我想我可以在这里提供所有必要的信息。请给我一个建议好吗?

【问题讨论】:

  • 你能追加 project.json 吗?
  • 我没有得到 project.json 包工作的自动引用(尽管有文档)。我只是复制 dll 并使用 #r 引用它们。
  • 您使用的是最新的 Functions 运行时版本 (1.0) 吗?我自己试了一下,效果很好。我将该包添加到 project.json 中,该包已自动恢复。我使用语句(没有#r)添加了所需的 EF 并编译了所有内容。
  • @Youngjae 更新了我的问题。请看一看。
  • @StephenCleary 这正是我所做的。

标签: entity-framework azure-functions


【解决方案1】:

以下步骤适用于最新的 Functions 运行时 (1.0)。创建一个新函数(例如 ManualTrigger),并使用“查看文件”UI 添加一个新的 project.json 文件,其内容如下:

{
  "frameworks": {
    "net46":{
      "dependencies": {
        "EntityFramework": "6.1.3"
      }
    }
   }
}

保存文件后,您应该会在函数日志窗口中看到包恢复,例如:

2016-11-18T16:50:05.772 Starting NuGet restore
2016-11-18T16:50:06.991 Restoring packages for D:\home\site\wwwroot\ManualTriggerCSharp2\project.json...
2016-11-18T16:50:07.553 Committing restore...
2016-11-18T16:50:07.569 Writing lock file to disk. Path: D:\home\site\wwwroot\ManualTriggerCSharp2\project.lock.json
2016-11-18T16:50:07.620 D:\home\site\wwwroot\ManualTriggerCSharp2\project.json
2016-11-18T16:50:07.620 Restore completed in 645ms.
2016-11-18T16:50:07.631 
2016-11-18T16:50:07.631 NuGet Config files used:
2016-11-18T16:50:07.631 C:\DWASFiles\Sites\function-fun\AppData\NuGet\NuGet.Config
2016-11-18T16:50:07.631 
2016-11-18T16:50:07.631 Feeds used:
2016-11-18T16:50:07.631 https://api.nuget.org/v3/index.json
2016-11-18T16:50:07.662 
2016-11-18T16:50:07.662 
2016-11-18T16:50:07.709 Packages restored.

之后,您可以简单地将 EF using 语句添加到您的代码中,它将成功编译:

using System;
using System.Data.Entity;
using System.Data.Entity.Infrastructure;
using System.Data.Entity.Core.Objects;
using System.Linq;

public static void Run(string input, TraceWriter log)
{
    log.Info($"C# manually triggered function called with input: {input}");
}

【讨论】:

  • 谢谢,@mathewc。当我留下对该问题的评论时,我能够编译该函数本身。但是,当我运行代码时,它抛出了异常。
猜你喜欢
  • 1970-01-01
  • 2019-05-08
  • 2015-12-26
  • 2018-06-06
  • 2011-08-08
  • 2014-03-24
  • 2018-04-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多