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:
2 – Crie sua classe de acesso a dados passando a string de conexão que você deseja utilizar:
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:
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:
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
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
7 – Você pode rodar a sua aplicação e desta vez a migração adicionou os dados iniciais ao banco de dados:
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" } } } ); } } }