normalian blog

Let's talk about Microsoft Azure, ASP.NET and Java!

続Windows Azureで気づいたこと

Windows Azure TableでCRUDアプリケーションを作っていると、結構Azureでの課題というか、はまりどころが見えてきました。せっかくなのでいくつかメモしておきます。

実装されていないLINQメソッドが多い

TableStorageDataServiceContextで弄るデータアクセス以下のメソッドが実装されていません。が、OrderByがらみが実装されていないのは痛いよなぁ…。この辺りはどうしたら良いものだろうか…。

  • Single
  • SingleOrDefault
  • OrderBy
  • OrderByDescending
  • Count
  • Min
  • Max
  • Average

Partition Keyを更新しようとすると例外が発生する

Windows Azure TableにアクセスするクラスはMicrosoft.Samples.ServiceHosting.StorageClient.TableStorageEntityを継承する必要がありますが、当該クラスには以下3つの必須プロパティが存在します。

  • Timestamp
  • Partitionkey
  • RowKey

PartitionKeyが何物かは【MS tech・days】Windows Azureのストレージ機能はクラウドを考慮した仕組みにを参照して頂くとして、こいつを更新する処理を入れると以下の例外出ますのでご注意を。まぁ、PartitionKeyが何物かをちゃんと確認すれば、当たり前な事と言えますが…。

'System.ArgumentException' の初回例外が System.Data.Services.Client.dll で発生しました。
System.ArgumentException: コンテキストは現在エンティティを追跡していません。
パラメータ名: entity
   場所 System.Data.Services.Client.DataServiceContext.UpdateObject(Object entity)
   場所 MvcTableApp.Models.CommentRepository.UpdateComment(Comment comment) 場所 C:\my_program\CSharp\ProjectsCloud\CloudServiceTableMvc\MvcTableApp\Models\CommentRepository.cs:行 85
   場所 MvcTableApp.Controllers.HomeController.Edit(Comment comment) 場所 C:\my_program\CSharp\ProjectsCloud\CloudServiceTableMvc\MvcTableApp\Controllers\HomeController.cs:行 93
'RdRoleHost.exe' (マネージ型): 'C:\Windows\assembly\GAC_MSIL\Microsoft.VisualStudio.Debugger.Runtime\9.0.0.0__b03f5f7f11d50a3a\Microsoft.VisualStudio.Debugger.Runtime.dll' が読み込まれました

時系列に対する参照系の取得について

上記で記述した通り、OrderByメソッドが存在しないため、以下のような記述の仕方ができません。

return _dataContext.Comments.OrderBy( comment => comment.Timestamp ).Take(count).ToList();

だからと言って、以下のような記述をするのはレコード数が増えた場合に性能問題が出るしなぁ…。

return _dataContext.Comments.ToList().OrderBy( comment => comment.Timestamp ).Take(count).ToList();