具有实体框架的Azure功能

时间:2016-11-18 07:15:05

标签: entity-framework azure-functions

我使用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(任务任务)

     

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

     

---抛出异常的前一个位置的堆栈跟踪结束---

     

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

     

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

     

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

     

---抛出异常的前一个位置的堆栈跟踪结束---

     

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

     

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

     

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

     

---抛出异常的前一个位置的堆栈跟踪结束---

     

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

     

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

     

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

     

---抛出异常的前一个位置的堆栈跟踪结束---

     

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

     

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

     

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

     

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

     

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

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

1 个答案:

答案 0 :(得分:2)

以下步骤适用于最新的函数运行时(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}");
}