月別アーカイブ: 2014年2月

Visual Studio 2013 で Entity Framework のコードジェネレータが動かないとお困りのあなたへ

Visual Studio 2013 を C ドライブ以外のドライブにインストールし、Entity Framework のコードジェネレータを動かした時のこと。ツールが存在しないと怒られ、コードが生成されませんでした。
原因は単純で、環境変数 VS120COMNTOOLS のパスがインストール時に C: ドライブ前提で設定されているからです。この現象、CTP版だった頃から発生していた現象で、リリース後も残っていました。
単純に、環境変数のパス文字列を正しいドライブに修正し、Visual Studio 2013を再起動するだけです。
ちなみに、PowerShell で 環境変数を表示させるには「dir Env:」と入力します。

Azure WebSites の .NET Framework が 4.5.1 にアップデートされました。

Azure WebSites の .NET Framework が、4.5 から 4.5.1 にインプレースアップデートされたみたいですね。うちのテナントのインスタンスも確かめなくちゃ。ちなみに、この情報は、しばやん大先生のブログ記事を見つけてくれた、うちの会社の若い子によります。ありがとう。若い子!

何が重要かって、TransactionScope の async/await インフラストラクチャ対応ですよ。Entity Framework 6 の DbContext が非同期実行に対応しているのに対し、TransactionScope は対応していなかったんです。

具体的には、await される度にどのスレッドで再開されるかわからないのが async/await です(実際は、WPFだとUIスレッドに戻ってきたり、ASP.NETだとどのスレッドかわからないけど HttpContext は同一だったりし、フレームワークに合ったコンテキストの保ち方をします)。しかし、EF5 までの DbContext も、.NET 4.5 までの TransactionScope もスレッド依存だったんですね。TransactionScope に関しては、ライフサイクルをスレッドで管理していたようで(おそらく)、await に対応するには、SyncrhonizationContext で管理する必要があると考えられます。おそらく 4.5.1 からそれに対応できたのでしょう。TransctionScope コンストラクタのパラメータに、非同期対応を行うか同課のパラメータが追加されました。ちなみに、.NET 4.5.1 は、Windows Server 2012 R2 にはインストールされているので、ずいぶん前にリリースされています。

しかし、ちょーお手軽 PaaS (IIS の間貸し)である Azure WebSites は、ベースOSがWindows Server 2012 のまま。.NET Framework だけアップデートしようにも、IaaS ではないので、対応を待つしかありませんでした。そして、いつの間にか更新されていました。

TransactionScope が async/await に非対応なら、それ相当の書き方があるのでいいっちゃいいんですが、ようは、トランザクション区間に入って出るまでを1スレッドで実行しなくちゃいけないので、せっかくの async/await インフラストラクチャもタスクパケットの占有時間が長いわけです。CPU時間がもったいないことになるのです。

さて、これで心おきなく Entity Framework と TransactionScope で async/await できるぞ!