Uso do Cloud SQL com .NET

Nesta parte do tutorial do Bookshelf para .NET, confira como os dados permanentes do app de amostra são armazenados no Cloud SQL.

Esta página é parte de um tutorial com várias páginas. Para ver do início e ler as instruções de configuração, consulte o artigo App Bookshelf em .NET.

  1. Crie uma instância de segunda geração do Cloud SQL.

    Crie uma instância

    1. Em Código da instância, digite library.
    2. Na parte inferior da página, clique em Criar. Pode levar alguns minutos para a instância ser criada. Quando a instância estiver pronta, ela será exibida na lista Instâncias.
  2. Faça o download e configure o Cloud SQL Proxy para acessar com segurança sua instância de segunda geração do Cloud SQL.

    Configure o Cloud SQL Proxy

Como definir configurações

  1. No diretório getting-started-dotnet\aspnet\2-structured-data, clique duas vezes em 2-structured-data.sln para abrir o app de amostra no Visual Studio.

  2. No painel Gerenciador de Soluções, clique em Web.config.

  3. Em Web.config, conclua as etapas a seguir:

    1. Defina GoogleCloudSamples:ProjectId como código do projeto.

    2. Defina GoogleCloudSamples:BookStore como mysql.

    3. Perto do final do arquivo, em <connectionStrings>, localize o subelemento XML connectionStrings com o atributo name="LocalMySqlServer". Atualize o valor connectionString com o endereço IP, o nome de usuário e a senha da instância do Cloud SQL.

  4. Salve e feche Web.config.

  5. No menu do Visual Studio, clique em Compilar e em Compilar solução para criar a solução.

  6. Para criar as tabelas de banco de dados, no menu do Visual Studio, acesse Ferramentas > Gerenciador de Pacotes NuGet > Console do Gerenciador de Pacotes. No prompt PM >, digite o seguinte comando:

    Add-Migration Init
    
  7. Crie as tabelas no banco de dados do Cloud SQL usadas para armazenar os dados de livros para o aplicativo Bookshelf. No Console do Gerenciador de Pacotes, digite o seguinte comando:

    Update-Database
    

Como executar o aplicativo na máquina local

No Visual Studio, pressione F5 para executar o projeto. Agora, navegue nas páginas da Web do aplicativo para adicionar, editar e excluir livros.

Como implantar o app no Compute Engine

  1. No painel Gerenciador de Soluções do Visual Studio, clique com o botão direito do mouse em 2-structured-data e clique em Publicar.

    Publicar app

  2. Na caixa de diálogo Publicar Web, selecione Personalizado como destino de publicação.

  3. Na caixa de diálogo Novo perfil personalizado, digite bookshelf-profile para o Nome de perfil. Clique em OK.

  4. Preencha o perfil:

    1. Em Servidor, digite o endereço IP externo da instância do Compute Engine.

    2. Em Nome do site, digite Default Web Site.

    3. Em Nome de usuário, digite o nome de usuário da conta de usuário do Windows que você criou na sua instância do Compute Engine.

    4. Em Senha, digite a senha da conta de usuário do Windows que você criou na sua instância do Compute Engine.

    5. Em URL de destino, digite http://[EXTERNAL_IP_ADDRESS_OF_YOUR_COMPUTE_ENGINE_INSTANCE].

      Onde:

      • [EXTERNAL_IP_ADDRESS_OF_YOUR_COMPUTE_ENGINE_INSTANCE] representa o endereço IP externo da instância do Compute Engine.
  5. Para verificar suas credenciais e configurações de perfil, clique em Validar conexão.

  6. Como a instalação do Microsoft IIS na sua implantação usa um certificado autoassinado por padrão, você verá um Erro de certificado durante o processo de validação. Marque a caixa Salvar este certificado para sessões futuras do Visual Studio e clique em Aceitar para aceitar o certificado.

  7. Clique em Configurações.

  8. Clique em Opções de publicação de arquivo e selecione Remova arquivos adicionais no destino. Isso é importante para as etapas posteriores, quando você publicar novos sites na mesma instância do Compute Engine.

  9. Clique em Publicar para implantar o exemplo de aplicativo da Web. Depois que a publicação for concluída, o Visual Studio abrirá o aplicativo no navegador da Web padrão.

Estrutura do app

Este diagrama mostra os componentes do app e como se encaixam. Ele segue o padrão ASP.NET MVC clássico. Há uma interface IBookStore entre BooksController e DbBookStore para que você possa começar a armazenar seus dados de livros no Cloud Datastore sem alterar qualquer código.

Estrutura do aplicativo Bookshelf

Noções básicas sobre o código

Esta seção analisa o código do aplicativo e explica como ele funciona.

O modelo de dados

A classe Book contém informações sobre um livro, além de campos adicionais que são usados em tutoriais posteriores.

    [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; }
    }

O DbSet do Entity Framework converte consultas LINQ e operações Create, Read, Update e Delete (CRUD) em consultas SQL. O ApplicationDbContext guarda um DbSet de livros.

public class ApplicationDbContext : DbContext
{
    // ...
    public DbSet<Book> Books { get; set; }

Como processar envios do usuário com formulários

O formulário permite adicionar e editar envios de livros no aplicativo.

Imagem do formulário para adicionar/editar

O formulário HTML é criado usando modelos Razor. Esse modelo especifica se o formulário incluirá campos de texto de entrada para título, autor, data de publicação e descrição:

<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>

Como processar envios do formulário

Quando você clica em Adicionar livro, o método BooksController.Create() exibe o formulário. Depois de preenchê-lo e clicar em Salvar, o método BooksController.Create() recebe o conteúdo do formulário e o envia para o banco de dados do Cloud SQL pelo método IBookStore::Create(). Observe que o método Create é anotado com 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);
        }

A classe DbBookStore chama o ApplicationDbContext para executar consultas e realizar operações de CRUD para os dados armazenados no banco de dados do Cloud SQL. A consulta SQL é criada com o uso de um Mapeamento objeto-relacional (ORM, na sigla em inglês) chamado Entity Framework. Os mapeadores objeto-relacional permitem escrever modelos de dados, como classes C# simples, e geram o SQL inteiro para você.

Os métodos CRUD do DbBookStore, como Create, são chamadas simples para o ApplicationDbContext.

public void Create(Book book)
{
    var trackBook = _dbcontext.Books.Add(book);
    _dbcontext.SaveChanges();
    book.Id = trackBook.Id;
}

Como listar livros

Depois que os livros são adicionados, clique no link Livros para acessar a página /Books, que lista todos os livros armazenados no banco de dados do Cloud SQL. O método List faz o trabalho de listar todos os livros usando dados recuperados do banco de dados.

public BookList List(int pageSize, string nextPageToken)
{
    IQueryable<Book> query = _dbcontext.Books.OrderBy(book => book.Id);
    if (nextPageToken != null)
    {
        long previousBookId = long.Parse(nextPageToken);
        query = query.Where(book => book.Id > previousBookId);
    }
    var books = query.Take(pageSize).ToArray();
    return new BookList()
    {
        Books = books,
        NextPageToken = books.Count() == pageSize ? books.Last().Id.ToString() : null
    };
}

O método List compõe uma consulta LINQ que lê livros do DbSet de Books. A consulta fica um pouco complicada para implementar paginação. A consulta lê dez livros e armazena o Id do último livro em NextPageToken. Quando você clica no botão Mais, o método List descompacta nextPageToken para receber o Id do último livro e consulta livros com códigos maiores.

Esta página foi útil? Conte sua opinião sobre:

Enviar comentários sobre…