【发布时间】: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.dll 和EntityFramework.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.dll 和EntityFramework.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