ASP NET – Migrations – Razor – MVC – C#

Publicado: 4 de julho de 2015 em C#

Quando você desenvolve um novo aplicativo, o seu modelo de dados muda com frequência, e cada vez que o modelo é alterado, ele fica fora de sincronia com o banco de dados. Você pode configurar o Entity Framework para excluir automaticamente e re-criar o banco de dados cada vez que você alterar o modelo de dados. Quando você adiciona, remove ou altera classes de entidade ou alterar a classe DbContext, na próxima vez que você executar o aplicativo ele automaticamente exclui o banco de dados existente, cria um novo que corresponda ao modelo, visto que este tipo de configuração automática é preciso que você utilize ambientes em seu desenvolvimento, como Sandbox, Testes, DEV e etc…

O Migrations permite que você gere atualizações gerenciáveis no seu banco de dados, ou deixar que o próprio Migrations cuide de tudo de forma automática, seu propósito é manter seu banco de dados sempre atualizado com suas classes. O  Migrations é muito utilizado em aplicações com o padrão MVC e se tornou popular no Framework Rails também é utilizado em ASP.NET de forma muito similar.

Utilizando Migrations

1 – Crie uma aplicação ASP.NET MVC usando o template padrão. No arquivo WebConfig crie sua string de conexão padrão, visto que o banco de dados será criado de acordo com o nome que você utilizar, use a figura abaixo para referencia:

MVC - String de conexão

MVC – String de conexão

2 – Crie sua classe de acesso a dados passando a string de conexão que você deseja utilizar:

MVC - Contexto do Banco de Dados

MVC – Contexto do Banco de Dados

3 – Substitua ou crie as classes abaixo de sua aplicação e rode, você vai obter uma pagina vazia, pois o banco de dados acabou de ser criado automaticamente e ainda não possui nenhuma informação:

MVC - Novo Banco

MVC – Novo Banco

4 – Se você desejar pode abrir o estúdio do SQL Server e verificar o banco e as tabelas criadas automaticamente pelo EF, você pode utilizar um diagrama para melhor entendimento do que foi criado, incluindo o seu relacionamento:

SQL - Diagrama

SQL – Diagrama

5 – Assim como no Rails, o ASP.NET MVC nos permite utilizar as migrações através da linha de comando, para isto vamos utilizar a janela chamada Package Manage Console que executa comandos do Windows PowerShell. Para abrir a janela utilize o menu View->Other Windows->Package Manage Console. Atente-se a figura abaixo, você pode perceber que uma nova pasta para as migrações foi criada em sua aplicação.

Digite o comando: Enable-Migrations -ContextTypeName MinhaAppMeuDB

MVC - Migrations

MVC – Migrations

6 – Você pode adicionar dados a serem gravados toda vez que você migrar o banco de dados utilizando o método Seed, preencha a classe de configuração da migração e digite o comando: Update-Database -Verbose

Configuração -Migrations

Configuração -Migrations

7 – Você pode rodar a sua aplicação e desta vez a migração adicionou os dados iniciais ao banco de dados:

MVC - Aplicação

MVC – Aplicação

Exemplo:

Neste exemplo criamos um banco de dados e inserimos dados iniciais de utilizando o Migrations.

C#

Modelos

using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Linq;
using System.Web;

namespace WebApplication1.Models
{
    public class MinhaAppMeuDB : DbContext
    {
        // Define string de conexão  de sua aplicação
        public MinhaAppMeuDB() : base("name=DefaultConnection")
        { }

       public DbSet<CursosModelo> Cursos { get; set; }
       public DbSet<GradeModelo>  Grades { get; set; }

    }
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace WebApplication1.Models
{
    public class CursosModelo
    {
        // Propriedades
        public int Id { get; set; }
        public string Curso { get; set; }
        public string Linguagem { get; set; }
        public string Descr { get; set; }

        // Aponta para o Grade
        public ICollection<GradeModelo> Cursos { get; set; }
    }
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace WebApplication1.Models
{
    public class GradeModelo
    {
        // Propriedades
        public int Id { get; set; }
        public string Dia { get; set; }
        public string hora { get; set; }

        // Cria relacionamento
        public int IdCursoModelo { get; set; }
    }
}

Visão

@model IEnumerable<WebApplication1.Models.CursosModelo>

@{
    ViewBag.Title = "Home Page";
}

<div class="jumbotron">
    <h1>Desenvolvimento Aberto - ASP.NET</h1>
    <p class="lead">ASP.NET - MVC - Entity Framework - HTML, CSS and JavaScript.</p>
</div>

<table style="width:700px">
    <tr>
        <th>Cursos</th>
        <th>Linguagem</th>
        <th>Descrição</th>
    </tr>

    @foreach (var item in Model)
    {
        <tr>
            <td>@item.Curso</td>
            <td>@item.Linguagem</td>
            <td>@item.Descr</td>
        </tr>

    }
</table>

Controlador

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using WebApplication1.Models;

namespace WebApplication1.Controllers
{
    public class HomeController : Controller
    {
        // Cria instancia do banco de dados
        MinhaAppMeuDB DB = new MinhaAppMeuDB();

        public ActionResult Index()
        {
            var modelo = DB.Cursos.ToList();
            return View(modelo);
        }

        // Cria método override
        protected override void Dispose(bool disposing)
        {
            // Limpa os recursos

            if (DB != null)
            {
                DB.Dispose();
            }
            base.Dispose(disposing);
        }

        public ActionResult About()
        {
            ViewBag.Message = "Your application description page.";

            return View();
        }

        public ActionResult Contact()
        {
            ViewBag.Message = "Your application description page.";

            return View();
        }
    }
}

Migração

namespace WebApplication1.Migrations
{
    using System;
    using System.Collections.Generic;
    using System.Data.Entity;
    using System.Data.Entity.Migrations;
    using System.Linq;

    internal sealed class Configuration : DbMigrationsConfiguration<WebApplication1.Models.MinhaAppMeuDB>
    {
        public Configuration()
        {
            AutomaticMigrationsEnabled = true;
            ContextKey = "WebApplication1.Models.MinhaAppMeuDB";
        }

        protected override void Seed(WebApplication1.Models.MinhaAppMeuDB context)
        {
            // Cria configuração inicial
            context.Cursos.AddOrUpdate( r=> r.Curso, 

                new Models.CursosModelo { Curso = "ASP.NET MVC", Linguagem = "C#", Descr = "Aplicações para web" },
                new Models.CursosModelo { Curso = "Ruby on Rails", Linguagem = "Ruby", Descr = "Aplicações para web" },
                new Models.CursosModelo { Curso = "Django", Linguagem = "Python", Descr = "Aplicações para web" },

                new Models.CursosModelo { Curso = "Java EE", Linguagem = "Java", Descr = "Aplicações para web",

                 Cursos  =  new List<Models.GradeModelo> {
                            new Models.GradeModelo { Dia = "Quarta", hora = "10:30" }
                   }
                }
            );
        }
    }
}

Anúncios

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s