我正在尝试使用Azure功能来处理EF6并且有一些奇怪的零星问题。它已经工作了两次,但没有工作过其他一百次。我得到的错误是:
Microsoft.Azure.WebJobs.Script:发生了一个或多个错误。 EntityFramework:' MyDbConfiguration'的实例已经确定但是这个 类型未在与' MyDbContext'相同的程序集中被发现。 上下文。将DbConfiguration类型放在同一个程序集中 DbContext类型,在DbContext上使用DbConfigurationTypeAttribute 用于指定DbConfiguration类型的类型,或设置DbConfiguration 输入配置文件。看到 http://go.microsoft.com/fwlink/?LinkId=260883了解更多信息。
我正在以编程方式设置提供程序,因为在没有app.config
文件的情况下,我不知道其他任何方法。我之前遇到过(可怕的)DbConfiguration
单身人士限制,但在这种情况下,我不明白为什么它不起作用。
Azure函数运行时是否将我的.csx
文件拆分为多个程序集?我尝试将内容更改为嵌套/私有类,内部和其他各种随机更改,但它不起作用(或者至少不是一致的)。我的下一次尝试是正常上传App.config
文件,看看是否有效......
令人不安的是有时它确实有效。然而,它似乎是随机的,而且很少见。可能在闲置一段时间之后;我在写这篇文章时尝试了一些更改,并且它最初工作,然后没有,然后仍然在恢复我的更改后没有工作。
我正在通过Azure门户保存和测试按钮进行编辑和测试(并在VS中首先编写代码以进行语法检查和IntelliSense ...)。这是代码(更新将遵循):
using System.Net;
using System.Data.Entity;
using System.Data.Entity.ModelConfiguration.Conventions;
public static async Task<HttpResponseMessage> Run(HttpRequestMessage req, TraceWriter log)
{
log.Info($"C# HTTP trigger function processed a request. RequestUri={req.RequestUri}");
using (var db = new MyDbContext("...")) {
log.Info(db.Events.First().id.ToString());
}
}
#region POCOs
public class Event {
public long id {get;set;}
public string data {get;set;}
}
#endregion
[DbConfigurationTypeAttribute(typeof(MyDbConfiguration))]
public class MyDbContext : System.Data.Entity.DbContext {
public DbSet<Event> Events {get;set;}
public MyDbContext(string cs) : base(cs) { }
}
public class MyDbConfiguration : System.Data.Entity.DbConfiguration {
public MyDbConfiguration() {
SetDefaultConnectionFactory(new System.Data.Entity.Infrastructure.SqlConnectionFactory());
SetProviderServices("System.Data.SqlClient", System.Data.Entity.SqlServer.SqlProviderServices.Instance);
}
}
更新1:更糟糕的是,如果我更改了某个类的名称(例如DbConfigurationx
),保存并运行它会产生与上面相同的错误,对于旧类名,所以我不相信编辑器中的代码是正在运行的代码......这有点令人担忧。这是服务应该如何工作?
更新2:添加App.config
没有任何效果。螺母。
更新3:添加Web.config
似乎已经解决了 - 它可以进行六次测试,但之后又停止了工作。我还看到日志消息出现故障,它正在运行并且有时在编译完成之前未通过测试,因此我真的不确定WTF是否正在使用此服务并且我不确定我是否可以推荐使用如果它不一致,它在任何地方。我能够通过避免所有EF启动废话并创建我自己的数据库连接并将其传递到上下文来使其工作。如果这实际上证明随着时间的推移可靠,我将添加一个答案,我是如何做到的。我想手动打开数据库连接是可以的,因为这是一次性请求,不幸的是我认为这意味着它没有使用共享连接池,所以它会减慢一切(目前看来肯定是这样)。 / p>
假设这会起作用,总的来说我非常失望; AWS Lambda是一个更大的PITA,但 可预测,后者更为重要。让事情工作所花费的时间与我大致相同(处理EF和Azure的一般怪异,AWS的控制台配置)。
更新4:好吧,我尝试将POCO移动到另一个程序集中,一旦我开始工作(尝试成为操作词),我计划完成这个程序集。我改为使用Git进行部署,所以我可以在VS中构建。首先,我通过Git部署获得了单文件版本,这花了几个小时。构建另一个DLL意味着我需要为JsonIgnore
添加Newtonsoft.Json(Json),并为其添加EF。我遇到了Json版本的问题(DLL地狱在.NET中运行得很好)但是这些东西没有记录在我能找到的任何地方,所以我在我的{{1}中将Json作为一个nuget包添加到了EF的一边。文件,但后来它停止了更新:
2016-05-22T08:40:36更新分支&#39; master&#39;。 2016-05-22T08:40:37个
无法删除&#39; D:/home/site/wwwroot/execution/bin/common.dll': 访问被拒绝。2016-05-22T08:40:39发生错误,输入:错误,文字: 无法删除&#39; D:/home/site/wwwroot/execution/bin/common.dll': 访问被拒绝。 ,stackTrace:at LibGit2Sharp.Core.Ensure.HandleError(Int32结果)at LibGit2Sharp.Core.Proxy.git_checkout_tree(RepositorySafeHandle repo, ObjectId treeId,GitCheckoutOpts&amp;选择) LibGit2Sharp.Repository.CheckoutTree(树树,IList`1路径, IConvertableToGitCheckoutOpts opts)at LibGit2Sharp.Repository.Checkout(树状树,CheckoutOptions checkoutOptions,String headTarget,String refLogHeadSpec,Signature 签名)在LibGit2Sharp.Repository.Checkout(分支机构, CheckoutOptions选项,签名签名) LibGit2Sharp.Repository.Checkout(String committishOrBranchSpec, CheckoutOptions选项,签名签名) Kudu.Core.SourceControl.Git.LibGit2SharpRepository.Update(String id)
在 Kudu.Core.Deployment.DeploymentManager.d__25.MoveNext() 2016-05-22T08:40:39发生错误,输入:错误,文字:一个 或更多错误发生。,stackTrace:at System.Threading.Tasks.Task.ThrowIfExceptional(布尔 includeTaskCanceledExceptions)at System.Threading.Tasks.Task.Wait(Int32 millisecondsTimeout, 取消语音取消语言) Kudu.Console.Program.PerformDeploy(String appRoot,String wapTargets, String deployer,String lockPath,IEnvironment env, IDeploymentSettingsManager settingsManager,TraceLevel level,ITracer tracer,ITraceFactory traceFactory,IOperationLock deploymentLock), innerText:部署失败,innerStackTrace:at Kudu.Core.Deployment.DeploymentManager.d__25.MoveNext() 2016-05-22T08:41:25.266工作主持人停止了
认为我打破了它,我从project.json
删除了Json包并进行了部署,这似乎有效,但现在我在测试时得到了404。也许我把整个主机搞砸了......重启App Service似乎解决了它(一个正在运行的主题),但没有。现在,当我推送到Git时,它实际上并没有更新应用程序...&#34; log streaming&#34;也没有说什么。叹息。
原来它是相同的&#34;访问被拒绝&#34;如上所述的错误,但这些内容并未显示在Azure Functions日志流中,但它在project.json
端点中显示。
我想我现在会[尝试]回到单个文件。
更新5:我能够将EF位放入我/api/logstream
的{{1}}文件和common.csx
文件中。从技术上讲,它可以工作,但是我遇到了另一个问题。虽然我的所有代码都可以无需修改地工作,但它是零星的。大多数时候(> 75%)我似乎得到了错误的部署&#34;我的一些功能不能编译而不能工作。症状是系统说它无法找到#load
或说没有run.csx
提供商。这可以在部署时立即发生,也可以在某些请求成功完成后立即发生。我认为经过一段时间后,比如它闲置X分钟,或某种内部回收,但我不确定。好像我在System.Data.Entity
中指定的EntityFramework包只是&#34;消失了&#34;。
我可以&#34;重新部署&#34;通过触摸(例如,在末尾添加一个空白行)System.Data.SqlClient
文件(没有JSON或project.json
更改),推送Git,系统注意到更改,尝试下载包(但没有& #39;安装任何),一切都神奇地开始工作。没有代码或包更改!更奇怪的是,有时我的两个函数中的一个就像这样打破了,但是另一个没有,但是它们以同样的方式得到修复。我经常需要重新重新部署才能使我的功能进入工作状态。
本文可能通过故障排除得到了一些偏离主题的内容。 原始问题是我的EF project.json
无法正常使用&#34;正常&#34;根据系统,使用.csx
属性的方式因为某处已经有DbContext
。除非有特定问题要尽量减少垃圾邮件,否则我将停止更新。
我发现了十几个其他问题,从烦恼或意外行为到阻止我必须解决的问题,但这不是通过这些问题的场所。我很乐意帮助重复或讨论它们,但不幸的是,我不知道那个场地是什么。
答案 0 :(得分:1)
乔希, 对不起,您的体验令人沮丧。我现在不在电脑前,但想看看我是否能提供一些帮助,并会尽快重复你的情景。
构成函数的所有类型(在单个或多个.csx文件中)都被编译为单个程序集。所以来自EF的错误确实令人费解。
功能不支持App.config。
您可以在此期间尝试的一种方法(直到我们找到导致您遇到问题的原因),将EF类型和POCO部署为单独的程序集,然后您可以从函数中引用它。为此,只需将该程序集复制到函数文件夹下的bin文件夹中,然后将#r "YourAssemblyName.dll"
添加到函数文件的顶部。希望这会阻止你。
当我能够重新编写您的方案并获得更多信息时,我会发布更新。
答案 1 :(得分:0)
使用最新版本的Entity Framework,我已使用version 6.1.3
进行了测试。然后无需指定任何DbConfiguartion
。您可以安全地删除DbConfiguration
代码,只需保留DbContext
这不会抛出异常,希望一切都能正常工作。
using System.Net;
using System.Data.Entity;
using System.Data.Entity.ModelConfiguration.Conventions;
public static async Task<HttpResponseMessage> Run(HttpRequestMessage req, TraceWriter log)
{
log.Info($"C# HTTP trigger function processed a request. RequestUri={req.RequestUri}");
using (var db = new MyDbContext("...")) {
log.Info(db.Events.First().id.ToString());
}
}
#region POCOs
public class Event {
public long id {get;set;}
public string data {get;set;}
}
#endregion
public partial class MyDbContext : System.Data.Entity.DbContext {
public MyDbContext(string cs) : base(cs) { }
public DbSet<Event> Events {get;set;}
}