2016-05-21 9 views
0

EF6で動作するようなAzure関数を取得しようとしています。それは2回働いたが、他の何百回も働いていない。私が得るエラーは:Azure関数がEntity Frameworkでアセンブリ内のDbConfigurationを見つけることができません

Microsoft.Azure.WebJobs.Script:1つ以上のエラーが発生しました。 EntityFramework: 'MyDbConfiguration'のインスタンスが設定されましたが、この タイプは 'MyDbContext' コンテキストと同じアセンブリで検出されませんでした。 DbConfigurationタイプを DbContextタイプと同じアセンブリに配置するか、DbContextタイプタイプのDbConfigurationTypeAttributeを使用してDbConfigurationタイプを指定するか、DbConfiguration タイプを設定ファイルに設定します。詳細については、 http://go.microsoft.com/fwlink/?LinkId=260883を参照してください。

私はapp.configファイルなしで他の方法を知らないので、プロバイダーをプログラムで設定しています。私は前にEFのシングルトン制限(恐ろしい)DbConfigurationに遭遇しましたが、この場合、なぜ動作していないのか分かりません。

Azure関数のランタイムは、.csxファイルを複数のアセンブリに分割していますか?私はネストされた/プライベートクラス、内部、およびその他のランダムな変更に変更しようとしましたが、動作しません(または少なくとも一貫していません)。私の次の試みは通常通りApp.configファイルをアップロードし、それが動作するかどうかを見ています。

ぼんやりした物は時々です。しかし、それはランダムで、まれであるようです。おそらくしばらくの間アイドル状態になった後。私はこれを書いている間にいくつかの変更を試みましたが、最初はうまくいっていませんでしたが、その後は変更を元に戻しても機能しませんでした。

私はAzure Portal Save and Testボタンを使って編集してテストしています(そして、シンタックスチェックとIntelliSenseのためにVSのコードを最初に書きます)。

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のスタートアップの邪魔をすべて避け、自分のデータベース接続を作成し、それをコンテキストに渡すだけで、動作させることができました。これが実際に時間の経過とともに信頼できることが証明されたら、私はそれをどのようにして答えを追加します。私はDB接続を手動で開くことは大丈夫だと思います。残念ながら、残念ながら、共有接続プールを使用しないので、すべての作業が遅くなります(確かにこれまでのようです)。

これがうまくいくとすれば、全体的に私はかなり失望しています。 AWS LambdaはPITAの方がはるかに大きいですが、です。後者はもっと重要です。物事を動かすのに要した時間は私にとってはほぼ同じでした(EFとAzureの一般的な奇妙さ、AWSのコンソール設定)。


更新4:まあ私は私が(手術の単語であることを試みた)作業の事を持ったらとにかく行う上で計画された別のアセンブリへPOCOSを動かしてみました。 Gitを使ってVSにビルドできるように変更しました。最初に、Gitのデプロイメントでシングルファイルバージョンを稼働させましたが、これには数時間かかりました。別のDLLをビルドすると、JsonIgnoreのNewtonsoft.Json(Json)とEFを追加する必要があります。私はJsonのバージョンの問題に遭遇しましたが(DLLの地獄は生きていて.NETでもうまくいきます)、見つかった場所はどこにも書かれていないので、私はproject.jsonファイルのEFに沿ってNugetパッケージとしてJsonを追加しましたが、更新可能:

2016-05-22T08:40:36「master 'を更新しています。 2016-05-22T08:40:37
'D:/home/site/wwwroot/execution/bin/common.dll'を削除できませんでした: アクセスが拒否されました。

2016-05-22T08:40:39エラーの種類、発生しました:エラー、テキスト: ':/home/site/wwwroot/execution/bin/common.dll D': アクセスが拒否されましたが は削除できませんでした。 、スタックトレース: LibGit2Sharp.Core.Proxy.git_checkout_treeでLibGit2Sharp.Core.Ensure.HandleError(のInt32結果)(RepositorySafeHandleレポ、 のObjectId treeId、GitCheckoutOpts & OPTS)で LibGit2Sharp.Repository.CheckoutTreeに(ツリーツリー、IList` LibGit2Sharp.Repository.Checkout(分岐枝、 checkoutOptionsオプション、署名署名)で LibGit2Sharp.Repository.Checkout(ツリーツリー、checkoutOptions checkoutOptions、文字headTarget、列refLogHeadSpec、署名 署名)で1つのパス、 IConvertableToGitCheckoutOpts OPTS)で LibGit2Sharp.Repository.Checkout(String committishOrBranchSpec、 CheckoutOptionsオプション、Si Kudu.Core.SourceControl.Git.LibGit2SharpRepository.Update(文字列ID) Kudu.Core.Deployment.DeploymentManager.d__25.MoveNext(AT
でgnature署名)) 2016-05-22T08:40:39にエラーが発生し、種類:エラー、テキスト:。一つ 以上のエラーが発生し、スタックトレース: System.Threading.Tasks.Task.Wait(のInt32 millisecondsTimeout、 CancellationToken cancellationTokenで System.Threading.Tasks.Task.ThrowIfExceptional(ブール includeTaskCanceledExceptions)で) Kudu.Console.Program.PerformDeploy(文字列APPROOT、列wapTargets、 ストリングデプロイヤ、文字列LOCKPATH、IEnvironmentのENV、 IDeploymentSettingsManagでERはSettingsManager、TraceLevelのレベル、ITracer トレーサー、ITraceFactory traceFactory、IOperationLock deploymentLock)、 のinnerText:デプロイメントが失敗し、innerStackTrace: Kudu.Core.Deployment.DeploymentManager.d__25.MoveNext()で 2016-05-22T08:41:25 。266ジョブのホストが、私はそれを破ったことを考える

を停止し、私はproject.jsonからJSONパッケージを削除して展開し、動作するように見えたが、私はそれをテストするとき、今、私は404を取得します。たぶん私はホスト全体をボークしました...アプリケーションサービスの再起動は、それを修正するように見えました(実行中のテーマ)。今私がGitにプッシュすると、実際にはアプリケーションを更新しない...「ログストリーミング」は何も言わない。一口。

上記と同じ「アクセスが拒否されました」というエラーが表示されますが、Azure関数のログストリームには表示されませんが、/api/logstreamエンドポイントでは発生します。

は、私は今の単一のファイルに戻る[しよう]しますね。


更新5:まあ、私は私のrun.csxからというcommon.csxファイルと#loadにEFビットを置くことができました。それは技術的には機能しますが、別の問題が発生しました。私のコードはすべて変更なしで動作しますが、散発的です。時間の大部分(> 75%)は、私の機能の一部がコンパイルされず、うまく動作しない「悪い展開」をしているようです。症状は、システムがそれがSystem.Data.Entityあるいは全くSystem.Data.SqlClientプロバイダが存在しないと言ってを見つけることができないと言うことです。これは、デプロイするとき、または要求の一部が正常に実行された直後に発生します。私はそれがX分、または内部リサイクルの何らかの種類のためにアイドルであるような時間の後であると思うが、私は確信していない。これは、私がproject.jsonに指定したEntityFrameworkパッケージが「消える」ようなものです。

私はGitの通過押して、(例えば末尾に空白行を追加すること)には触れproject.jsonファイル(なしJSONまたは.csx変化)のことで、「再配布」することができ、システムはパッケージをダウンロードしようとし、変更に気づく(ただし、何もインストールされません)、すべてが魔法のように動作し始めます。コードやパッケージの変更はありません!でも見知らぬ人は、時々私の2つの関数のは次のように壊れ、他にはありませんが、彼らは同じように固定します。私はしばしば、両方の機能を動作状態にするために再再展開する必要があります。


この記事は、おそらくトラブルシューティングを通じて多少の話題になっています。 元の問題は、DbConfiguration属性を使用して私のEF DbContextが「通常の」方法で動作しなかったということでした。システムによっては、すでにDbConfigurationが演奏されていました。迷惑メールを最小限に抑えるための具体的な質問がない限り、更新を停止します。

私は厄介または予期しない動作から私の周りに仕事をしていた問題をブロックの範囲ダース他の問題について見つけたが、これはそれらを通過する場ではありません。私はreproや議論を手伝ってくれてうれしいですが、残念なことにその会場が何であるかはわかりません。

+0

ジョシュは、これは確かに我々が調査できるように、詳細にはGitHub(https://github.com/Azure/azure-webjobs-sdk-script)上の問題を開くことができ、従うことが少し難しいたどっています? –

答えて

1

ジョシュ、 申し訳ありませんが、あなたの経験はイライラしていました。私は現時点でコンピュータにはいないが、私はいくつかの助けを与えることができるかどうかを見たいと思って、できるだけ早くあなたのシナリオを再現しようとします。

  • (1つまたは複数の.csxファイルで)機能を構成するすべてのタイプが1つのアセンブリにコンパイルされます。 EFからのエラーは本当に困惑しています。

  • App.configファイルは、関数ではサポートされていません。あなたは(私たちはあなたに実行している問題を引き起こしているものを見つけることができるまで)その間に試すことができ

一つのアプローチは、あなたがしてから参照できる別のアセンブリとしてあなたEFの種類とPOCOを展開することですあなたの機能。これを行うには、そのアセンブリを関数フォルダのbinフォルダにコピーし、関数ファイルの先頭に#r "YourAssemblyName.dll"を追加します。うまくいけば、これであなたがブロックされます。

シナリオを再作成して詳細を知ることができたら、アップデートを投稿します。

+0

お返事ありがとうございます。できる場合(つまり、MSFTで)、私はあなたにそれを見るために私の機能、またはそれのジッパーまたは何かの情報を与えることができます。 – Josh

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;} 
} 
関連する問題