.NET で Cloud Datastore を使用する

.NET Bookshelf チュートリアルのこのパートでは、Cloud Datastore で構造化データを作成、読み取り、更新、削除する方法を示します。

このページは複数ページからなるチュートリアルの一部です。最初からの説明や設定手順を確認するには、.NET Bookshelf アプリに移動してください。

設定の構成

  1. Visual Studio でサンプルアプリを開くには、getting-started-dotnet\aspnet\2-structured-data ディレクトリで、2-structured-data.sln をダブルクリックします。

  2. [ソリューション エクスプローラ] パネルで、Web.config をクリックします。

  3. Web.config で次の操作を行います。

    1. GoogleCloudSamples:ProjectId を実際のプロジェクト ID に設定します。

    2. GoogleCloudSamples:BookStore に、「datastore」と設定します。

  4. Web.config を保存して閉じます。

ローカルマシンでのアプリの実行

Visual Studio で F5 キーを押してプロジェクトを実行します。これでアプリのウェブページを閲覧し、書籍の追加、編集、削除を行えるようになります。

Compute Engine にアプリをデプロイする

  1. Visual Studio の [ソリューション エクスプローラ] パネルで、2-structured-data を右クリックし、[発行] をクリックします。

    アプリを公開

  2. [Web の発行] ダイアログで、発行先として [カスタム] を選択します。

  3. [新しいカスタム プロファイル] ダイアログで、[プロファイル名] として「bookshelf-profile」と入力します。[OK] をクリックします。

  4. 以下のようにプロファイルを入力します。

    1. [サーバー] には、Compute Engine インスタンスの外部 IP アドレスを入力します。

    2. [サイト名] には「Default Web Site」と入力します。

    3. [ユーザー名] には、Compute Engine インスタンスで作成した Windows ユーザー アカウントのユーザー名を入力します。

    4. [パスワード] には、Compute Engine インスタンスで作成した Windows ユーザー アカウントのパスワードを入力します。

    5. [リンク先 URL] には「http://[EXTERNAL_IP_ADDRESS_OF_YOUR_COMPUTE_ENGINE_INSTANCE]」と入力します。

      ここで

      • [EXTERNAL_IP_ADDRESS_OF_YOUR_COMPUTE_ENGINE_INSTANCE] は、Compute Engine インスタンスの外部 IP アドレスを表します。
  5. 自分のプロフィールの認証情報と構成を確認するには、[接続の検証] をクリックします。

  6. デプロイ環境にインストールされている Microsoft IIS はデフォルトで自己署名証明書を使用するので、検証プロセスで証明書エラーが発生します。[Visual Studio の今後のセッションのためにこの証明書を保存] チェックボックスをオンにし、[承諾] をクリックして証明書を受け入れてください。

  7. [設定] をクリックします。

  8. [ファイル発行オプション] をクリックし、[ターゲットの追加ファイルの削除] をオンにします。後の手順で同じ Compute Engine インスタンスに対して新しいウェブサイトを発行するので、この設定は重要です。

  9. サンプル ウェブアプリをデプロイするには、[発行] をクリックします。発行が完了すると、Visual Studio はアプリをデフォルトのウェブブラウザで開きます。

アプリの構造

この図は、アプリを構成するコンポーネントと、互いの関係を示しています。この構造は、標準的な ASP.NET MVC のパターンに従っています。IBookStore インターフェースが BooksControllerDatastoreBookStore の間に存在するので、コードを変更せずに書籍データを Cloud Datastore に保存できます。

Bookshelf アプリの構造

コードの説明

このセクションでは、アプリのコードとその動作を順を追って説明します。

データモデル

Book クラスには、1 つの書籍に関する情報と、後のチュートリアルで使用される追加のフィールドが含まれています。

    [Bind(Include = "Title, Author, PublishedDate, Description")]
    public class Book
    {
        [Key]
        public long Id { get; set; }

        [Required]
        public string Title { get; set; }

        public string Author { get; set; }

        [Display(Name = "Date Published")]
        [DataType(DataType.Date)]
        public DateTime? PublishedDate { get; set; }

        public string ImageUrl { get; set; }

        [DataType(DataType.MultilineText)]
        public string Description { get; set; }

        public string CreatedById { get; set; }
    }

フォームを使用して、ユーザー送信を処理する

追加 / 編集 HTML フォームを使用すると、アプリ内で書籍情報の送信内容を追加、編集できます。

追加 / 編集フォームの画像

HTML フォームは、Razor テンプレートを使用して作成されます。この Razor テンプレートは、フォームの中にタイトル、著者名、出版日、説明のテキスト入力フィールドを含めることを指定します。

<form action="/Books/@Model.FormAction/@Model.Book.Id" method="post" id="book-form" enctype="multipart/form-data">
    @Html.AntiForgeryToken()
    <div class="form-group">
        @Html.LabelFor(model => model.Book.Title)
        @Html.EditorFor(model => model.Book.Title, new { htmlAttributes = new { @class = "form-control" } })
        @Html.ValidationMessageFor(model => model.Book.Title, "", new { @class = "text-danger" })
    </div>

    <div class="form-group">
        @Html.LabelFor(model => model.Book.Author)
        @Html.EditorFor(model => model.Book.Author, new { htmlAttributes = new { @class = "form-control" } })
        @Html.ValidationMessageFor(model => model.Book.Author, "", new { @class = "text-danger" })
    </div>

    <div class="form-group">
        @Html.LabelFor(model => model.Book.PublishedDate)
        @Html.EditorFor(model => model.Book.PublishedDate, new { htmlAttributes = new { @class = "form-control", @type = "text" } })
        @Html.ValidationMessageFor(model => model.Book.PublishedDate, "", new { @class = "text-danger" })
    </div>

    <div class="form-group">
        @Html.LabelFor(model => model.Book.Description)
        @Html.EditorFor(model => model.Book.Description, new { htmlAttributes = new { @class = "form-control", @type = "text" } })
        @Html.ValidationMessageFor(model => model.Book.Description, "", new { @class = "text-danger" })
    </div>

    <button type="submit" class="btn btn-success">Save</button>
</form>

フォーム送信を処理する

[Add Book] をクリックすると、BooksController.Create() メソッドによってフォームが表示されます。フォームに値を入力して [Save] をクリックすると、BooksController.Create() メソッドがフォームの内容を受け取り、IBookStore::Create() メソッドを介してその内容を Cloud SQL データベースに送信します。なお Create メソッドには HttpPost のアノテーションが付きます。

        // GET: Books/Create
        public ActionResult Create()
        {
            return ViewForm("Create", "Create");
        }

        // POST: Books/Create
        [HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult Create(Book book)
        {
            if (ModelState.IsValid)
            {
                _store.Create(book);
                return RedirectToAction("Details", new { id = book.Id });
            }
            return ViewForm("Create", "Create", book);
        }

DatastoreBookStore クラスは Cloud Datastore API を呼び出してクエリを実行し、CreateReadUpdateDelete(CRUD)オペレーションを行います。

以下に Create メソッドを示します。

public void Create(Book book)
{
    var entity = book.ToEntity();
    entity.Key = _db.CreateKeyFactory("Book").CreateIncompleteKey();
    var keys = _db.Insert(new[] { entity });
    book.Id = keys.First().Path.First().Id;
}

まず、CreateCreateIncompleteKey を呼び出して、新しいエンティティのキーを作成するよう Cloud Datastore に指示します。次に Insert を呼び出して、新しい書籍を Cloud Datastore に挿入します。最後に、書籍の ID を、Cloud Datastore で作成された新しいキーに更新します。ID は連番では作成されません。

DatastoreBookStoreExtensionMethods クラスには、Cloud Datastore に簡単に Book をパッキングできるヘルパー メソッドがいくつかあります。ToEntity ヘルパー メソッドは、Book を Cloud Datastore エンティティに変換します。

public static Entity ToEntity(this Book book) => new Entity()
{
    Key = book.Id.ToKey(),
    ["Title"] = book.Title,
    ["Author"] = book.Author,
    ["PublishedDate"] = book.PublishedDate?.ToUniversalTime(),
    ["ImageUrl"] = book.ImageUrl,
    ["Description"] = book.Description,
    ["CreateById"] = book.CreatedById
};

GitHub ですべてのヘルパー メソッドを表示します。

書籍の一覧表示

書籍が追加されたら、[Books] リンクをクリックして /Books ページに移動します。このページに、現在 Cloud Datastore に保存されているすべての書籍が一覧表示されます。List メソッドは、Cloud Datastore から取得したデータを使って、すべての書籍をリストアップします。

public BookList List(int pageSize, string nextPageToken)
{
    var query = new Query("Book") { Limit = pageSize };
    if (!string.IsNullOrWhiteSpace(nextPageToken))
        query.StartCursor = ByteString.FromBase64(nextPageToken);
    var results = _db.RunQuery(query);
    return new BookList()
    {
        Books = results.Entities.Select(entity => entity.ToBook()),
        NextPageToken = results.Entities.Count == query.Limit ?
            results.EndCursor.ToBase64() : null
    };
}

List メソッドは Query を作成および実行して、Book. タイプのエンティティをすべて検出します。 このメソッドは、Cloud Datastore のクエリカーソルを使用してページングを実装します。

このページは役立ちましたか?評価をお願いいたします。