ASP .NET MVC - CRUD básico com MongoDB


  Neste artigo vou mostrar as operações CRUD sendo realizadas com o MongoDB em um projeto ASP .NET MVC usando a linguagem C#.

Antes de prosseguir sugiro que leia o meu artigo  .NET - Apresentando e usando o MongoDB onde eu apresento o MongoDB, um resumo sobre os seus recursos e dou detalhes de instalação e de como iniciar o serviço MongoDB no Windows.

Neste artigo vamos fazer um CRUD básico usando o MongoDB e iremos precisar dos seguintes recursos:

1- Do banco de dados não relacional MongoDB que pode ser obtido neste link: https://www.mongodb.org/downloads

Selecione a versão adequada ao seu sistema operacional. Eu estou trabalhando com a versão 64 bits no Windows 10.

A instalação usando o pacote .msi irá instalar o MongoDB  na seguinte pasta :

2- Robomongo um gerenciador visual para o MongoDB que pode ser obtido neste link: http://robomongo.org/  (No nosso exemplo essa ferramenta é opcional)

3- O driver do MongoDB para a plataforma .NET que pode ser obtido neste link: https://github.com/mongodb/mongo-csharp-driver/downloads

No nosso exemplo iremos instalar o drive no nosso projeto usando o Nuget.

Nota: Existe um driver mais atualizado que deve ser instalado se você for usar o Visual Studio 2015.

4- Iniciar o MongoDB

Podemos fazer isso manualmente ou iniciar como um serviço do Windows. (veja no meu artigo como fazer isso)

Vamos iniciar manualmente.

Para isso vamos criar uma pasta chamada db_MongoDB na raiz do drive C: .  (Nome pode ser qualquer um)

Abra um prompt de comando no seu Windows e posicione-se na raiz do drive C: e a seguir digite o comando : md db_MongoDB

A seguir posicione-se na pasta onde o MongoDB foi instalado :

E digite o seguinte comando para iniciar o serviço  manualmente : mongod.exe --dbpath c:\db_MongoDB

Pronto ! temos um serviço MongoDB atendendo na porta 27017. (Não feche a janela pois precisaremos do serviço para acessar o MongoDB)

Criando o projeto Web no Visual Studio Community 2013

Abra o VS Community 2013 e clique em New Project;

Selecione a linguagem C# -> Web e o template ASP .NET Web Application e informe o nome Mvc_MongoDB;

A seguir selecione o template Empty e marque MVC clicando  a seguir no botão OK;

Assim nosso projeto web será criado com a seguinte estrutura visualizada na janela Solution Explorer:

Instalando o driver MongoDB para a plataforma .NET

No menu Tools  clique em Nuget Package Manager e a seguir em Manage Nuget Packages for Solution;

Digite Mongo na caixa de busca e a seguir selecione o pacote Official C# Driver for MongoDB , marque o projeto onde deseja instalar e clique no botão Install;

Nota: Se você usar o VS Community 2015 deverá instalar o driver atualizado : MongoDB.Driver.

Vamos definir no arquivo web.config a string de conexão conforme o código abaixo:

..
 <connectionStrings>
    <add name="conexaoMongoDB" connectionString="mongodb://localhost:27017"/>
  </connectionStrings>
..

Definindo o Model

Agora vamos criar o nosso domínio definindo na pasta Models as classes Pais e PaisDB.

Clique com o botão direito do mouse sobre a pasta Models e a seguir clique em Add Class e informe o nome Pais.cs.

A seguir digite o código abaixo nesta classe:

using MongoDB.Bson;
using MongoDB.Bson.Serialization.Attributes;
using System;
using System.ComponentModel.DataAnnotations;

namespace Mvc_MongoDB.Models
{
    public class Pais
    {
        [BsonRepresentation(BsonType.ObjectId)]
        public String Id { get; set; }

        [Required]
        [Display(Name="Nome")]
        public String PaisCodigo { get; set; }

        [Required]
        [Display(Name = "País")]
        public String PaisNome { get; set; }

        [Required]
        [Display(Name = "População")]
        public double PaisPopulacao { get; set; }
    }
}

Definimos a classe Pais com 4 propriedades : Id , PaisCodigo,PaisNome PaisPopulacao

Usando o Data Annotations usamos atributos para validar e atribuir os tipos das propriedades.

A propriedade Id é chamado ObjectId com o tipo de dados string com um atributo [BsonRepresentation(BsonType.ObjectId)]

O tipo ObjectId é o tipo mais comum usado para isso. O atributo Id deve ser único para cada documento em uma coleção.

O ObjectId é um valor binário de 12 bytes que consiste de:

O Driver C# tem um pool de conexão para usar conexões para o servidor de forma eficiente. Não há necessidade de Conectar e Desconectar, basta deixar o Driver cuidar das conexões.

Repita o procedimento acima e agora creia a classe PaisDB com código a seguir:

using MongoDB.Driver;
using System;
using System.Configuration;

namespace Mvc_MongoDB.Models
{
    public class PaisDB
    {
        public MongoDatabase Database;
        public String DataBaseName = "PaisDB";
        string conexaoMongoDB = "";

       public PaisDB ()
       {

            conexaoMongoDB = ConfigurationManager.ConnectionStrings["conexaoMongoDB"].ConnectionString;
            var cliente = new MongoClient(conexaoMongoDB);
            var server = cliente.GetServer();

            Database = server.GetDatabase(DataBaseName);
       }

        public MongoCollection<Pais> Paises
        {
            get
            {
                var Paises = Database.GetCollection<Pais>("Paises");
                return Paises;
            }
        }
    }
}

Nesta classe obtemos a string de conexão como MongoDB definida no arquivo web.Config e obtemos o nome do banco de dados (documento) (PaisDB).

Fazendo um paralelo com o modelo relacional e o MongoDB temos que entender alguns conceitos importantes:

Então podemos montar a seguinte tabela de equivalência entre o MongoDB e os RDBMS:

Banco de Dados Relacional MongoDB
Table Collection
Row Document
Column Field
Join Embedding
Schema -

Dessa forma o método Paises  retorna a coleção de países da tabela Pais no MongoDB.

Criando o controlador HomeController

Vamos agora criar o controlador na pasta Controllers.

Clique com o botão direito do mouse sobre a pasta Controllers e a seguir em Add Controller;

Selecione o Scaffold MVC5 Controller Empty;

Informe o nome HomeController e a seguir informe o código abaixo neste controlador:

using System.Web.Mvc;
using Mvc_MongoDB.Models;
using MongoDB.Bson;
using MongoDB.Driver.Builders;
namespace Mvc_MongoDB.Controllers
{
    public class HomeController : Controller
    {
        private readonly PaisDB Context = new PaisDB();
        public ActionResult Index()
        {
            var Paises = Context.Paises.FindAll().SetSortOrder(SortBy<Pais>.Ascending(r => r.PaisCodigo));
            return View(Paises);
        }
        public ActionResult Create()
        {
            return View();
        }

        [HttpPost]
        public ActionResult Create(Pais _pais)
        {
            if (ModelState.IsValid)
            {
                Context.Paises.Insert(_pais);
                return RedirectToAction("Index");
            }
            return View();
        }
        public ActionResult Edit(string Id)
        {
            var pais = Context.Paises.FindOneById(new ObjectId(Id));
            return View(pais);
        }
        [HttpPost]
        public ActionResult Edit(Pais _pais)
        {
            if (ModelState.IsValid)
            {
                Context.Paises.Save(_pais);
                return RedirectToAction("Index");
            }
            return View();
        }
        [HttpGet]
        public ActionResult Delete(string Id)
        {
            var del = Context.Paises.FindOneById(new ObjectId(Id));
            return View(del);
        }
        [HttpPost, ActionName("Delete")]
        public ActionResult DeleteConfirmed(string Id)
        {
            var del = Context.Paises.Remove(Query.EQ("_id", new ObjectId(Id)));
            return RedirectToAction("Index");
        }
    }
}
 

A classe acima define os seguintes métodos Action:

Neste código estamos usando a classe de domínio chamada PaisDB e teremos uma referência a uma coleção contendo documentos da entidade Pais.

A seguir criamos uma instância da classe PaisDB e usamos o objeto Context para acessar os métodos do MongoDB.

Os métodos MongoDB usados foram:

Método Descrição
FindAll Retorna todos os registros
SetSortOrder Consulta em ordem de classificação
Insert Adiciona um novo registro
FindOneById Encontra um registro com base no ObjectId
Save Atualiza o registro
Remove Remove um registro

Criando as Views do projeto

Agora falta criar as respectivas views para cada método Action. O procedimento usado será o mesmo para cada método Action alterando-se apenas o nome da view e o template usado.

1- Criando a View Index

  1. Compile a aplicação;
  2. Abra o arquivo HomeController.cs e clique com o botão direito do mouse sobre o método Index;
  3. Clique em Add View;
  4. Na janela Add View selecione o template List;
  5. Selecione Pais (Mvc_MongoDB.Models) em Model Class;
  6. Clique no botão Add;

2- Criando a View Create

  1. Abra o arquivo HomeController.cs e clique com o botão direito do mouse sobre o método Create (Get);
  2. Clique em Add View;
  3. Na janela Add View selecione o template Create;
  4. Selecione Pais (Mvc_MongoDB.Models) em Model Class;
  5. Clique no botão Add;

3- Criando a View Edit

  1. Abra o arquivo HomeController.cs e clique com o botão direito do mouse sobre o método Edit (Get);
  2. Clique em Add View;
  3. Na janela Add View selecione o template Edit;
  4. Selecione Pais (Mvc_MongoDB.Models) em Model Class;
  5. Clique no botão Add;

4- Criando a View Delete

  1. Abra o arquivo HomeController.cs e clique com o botão direito do mouse sobre o método Delete (Get);
  2. Clique em Add View;
  3. Na janela Add View selecione o template Delete;
  4. Selecione Pais (Mvc_MongoDB.Models) em Model Class;
  5. Clique no botão Add;

Eu não vou colocar o código das views pois ele é gerado pelo Scaffold e a única alteração que foi feita foi a tradução dos textos para o português. Alteramos também o texto do arquivo _Layout.cshtml da pasta Shared.

Executando o projeto e incluindo alguns países iremos obter o seguinte resultado:

Verificando os dados com RoboMongo

Após isso poderemos verificar os dados no MongoDB usando a ferramenta RoboMongo.

Abrindo o RoboMongo veremos uma janela que exibe as conexões criadas com opção para Criar, Editar e Remover conexões :

Para criar uma conexão clique no link create e informe o nome e o endereço e porta da conexão, salvando-a em seguida:

Para o nosso exemplo , vemos abaixo o nosso banco de dados aberto e os dados que foram inseridos exibidos :

O MongoDB é uma alternativa aos bancos de dados relacionais e dependendo do cenário pode ser uma opção válida de armazenamento e gerenciamento de informações e que responde muito rápido a consultas.

Pegue o projeto completo aqui :   Mvc_MongoDB.zip

Porque o amor ao dinheiro é a raiz de toda a espécie de males; e nessa cobiça alguns se desviaram da fé, e se traspassaram a si mesmos com muitas dores.
1 Timóteo 6:10

Veja os Destaques e novidades do SUPER DVD Visual Basic (sempre atualizado) : clique e confira !

Quer migrar para o VB .NET ?

Quer aprender C# ??

Quer aprender os conceitos da Programação Orientada a objetos ?

Quer aprender o gerar relatórios com o ReportViewer no VS 2013 ?

Quer aprender a criar aplicações Web Dinâmicas usando a ASP .NET MVC 5 ?

  Gostou ?   Compartilhe no Facebook   Compartilhe no Twitter

Referências:


José Carlos Macoratti