none
Azure Mobile Appでの、テーブル名とクラス名(ソース側)の定義について RRS feed

  • 質問

  • Azureの既存SQLデータベースを使ったWindowsアプリを作成してみたいと、
    Web+モバイルから、Mobile Appを選択し、クイックスタートからWindows(C#)を選択しました。

     クイックスタート 手順1.データベースは既存のデータベースを選択しました。

     クイックスタート 手順2.Backend languageは、C#を選択して雛形をダウンロードして、そのまま公開しました。

     クイックスタート 手順3.クライアントのアプリの雛形をダウンロードしました。

    このまま、クライアントアプリを実行したところ、既存データベースに、TodoItemsというテーブルが作成され、
    バックエンドのソースにあるように2レコード作成され、クライアントアプリでその2レコードが表示されました。

    ここまでは良いのですが、既存テーブルを操作する為にどのようにすればよいのか、
    色々試しましたが、思ったように既存テーブルにアクセスできなかった為、一度Azure上の定義を全て削除し、
    データベースから、作成済みのTodoItemsというテーブルも削除してから、再度Azureの定義から初めて、
    新たにダウンロードしたバックエンドのソリューション上で、Ctrl+Shift+Hを押下し、ソリューション全体の「TodoItem」を「TestTodoItem」に置換して公開しました。

    そして、これまた新たにダウンロードしたクライアントアプリの雛形で同じようにソリューション全体をの「TodoItem」を「TestTodoItem」に置換して実行してみたところ、

     Error loading items
     The request could not be completed.(Internal Server Error)

    と表示されてしまいました。

    そこで、質問があります。

    1.クラス名とテーブル名はどこで紐づけされているのでしょうか?
      クラス名=テーブル名なのかと思いましたが、サンプルそのままで作成されるテーブルが、
      TodoItemsであり、クラス名のTodoItemではありません。

    2.複数テーブルを結合した結果を取得する場合等は、バックエンド側で行わなければならないみたいな記述は、
      ネットでいくつか見つけられたのですが、具体的にどのように実装するのかのサンプルが見つけられません。
      参考になるサイトありませんか?

    2016年4月19日 9:13

回答

  • 投稿者です。

    概ね、自己解決した気がするので、追記します。

    まず、全置換しただけで正常に動作しなくなったのは、初回起動時に、
    既存データベースに、「__MigrationHistory」というテーブルが作成されていたので、
    初期化処理がうまくいってなかっただけだった。とりあえず、そのテーブルを削除したらできました。

    1.については、エンティティフレームワークが勝手にやってるっぽいですね。
      ただ、テーブル名や列名は、クラスにTableAttributeや列に、ColumnAttributeを付加することで変更可。
      詳しくは、System.ComponentModel.DataAnnotations.Schemaあたりを参照

    2.ApiControllerを継承したコントローラを作成し、Postメソッドで実装した。
      バックエンド側は、こんな感じ

    public async Task<List<ViewMessage>> Post(string UserId)
      {
       string sql = "";
       using (UwpTestBackendContext context = new UwpTestBackendContext())
       {
        // Get the database from the context.
        var database = context.Database;
        // Create a SQL statement that sets all uncompleted items
        // to complete and execute the statement asynchronously.
        sql = @"Select MSG_ID As MsgId, DST_USERID As UserId, MSG_KIND As Kind, MSG_TITLE As Title, MSG_MESSAGE As Message"
         + " From TBL_LSCDESTINATION Left Join TBL_LSCMESSAGE On DST_MSGID = MSG_ID Where DST_USERID = N'" + UserId + "'";
        return await database.SqlQuery<ViewMessage>(sql).ToListAsync();
       }
      }

    • 回答としてマーク しんや 2016年4月21日 7:33
    2016年4月21日 7:33