quarta-feira, 23 de abril de 2014

Criando um relacionamento Many-To-Many em um projeto em MVC com EntityFramework utilizando Code-First.

Crie um projeto em MVC e depois disto você deve adicionar o EntityFramework.

No Package Maneger Console digite: 
PM> Install-Package EntityFramework 
pressione enter para que o mesmo seja adicionado ao seu projeto.

Bom, como a ideia é trabalharmos com Code-First ou seja criar nossas entidades através do nosso código devemos incluir duas classes POCO que representarão nosso relacionamento Many-to-Many.

Classe Menu.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace MVC.Models
{
    public class Menu
    {
        public int Id { get; set; }
        public string Descricao { get; set; }
        public bool Ativo { get; set; }

        public virtual ICollection<Tela> Telas { get; set; }
    }
}

Classe Tela.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace MVC.Models
{
    public class Tela
    {
        public int Id { get; set; }
        public string Descricao { get; set; }
        public bool Ativo { get; set; }
        public string URL { get; set; }

        public virtual ICollection<Menu> Menus { get; set; }
    }
}


Após isso você deve criar uma classe Contexto onde o Code-First vai entender o que deve ser feito no banco de dados.
Esta classe herda de DbContext que faz parte da biblioteca do Entity, sem isso ele não vai entender o que deverá ser feito automaticamente por ele.
Perceba que os nomes das propriedades devem ter um s no final, isso ocorre devido ao padrão da língua inglesa pois esta representando uma lista de Menu e outra de Tela.
Abaixo criamos um método OnModelCreating que entre outras coisas serve também para remover a pluralização dos nomes de nossas entidades, ou seja, quando utilizarmos o Code-First ele vai entender que ele deve criar as tabelas no banco sem o “s” no final.

Classe Context.cs
using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Data.Entity.ModelConfiguration.Conventions;
using System.Linq;
using System.Web;

namespace MVC.Models
{
    public class Context:DbContext
    {
        public DbSet<Menu> Menus { get; set; }
        public DbSet<Tela> Telas { get; set; }


        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
        }
    }
}

No Web.Config crie sua String de Conexão

<connectionStrings>
    <add name="Context" providerName="System.Data.SqlClient" connectionString="data source=(Local);initial catalog=MVC;integrated security=True;MultipleActiveResultSets=True" />
  </connectionStrings>

Perceba que o nome recebe name=”Context” o nome de nossa classe Context, deve ser assim para que funcione.

Agora começa a brincadeira!

No Package Maneger Console você deve digitar PM> Enable-Migrations
Isso vai criar um repositório chamado Migrations em seu projeto, onde todas as migrações serão adicionadas. Isso são classes que são geradas automaticamente contendo o script para criar o DataBase e as Tabelas no banco de acordo com seu código.

Após isso digite
PM> Add-Migration AddInitialCreate
Isto vai adicionar as classes mencionadas acima, e para finalizar digite
PM> Update-Database

Para que as alterações sejam efetivadas, gerando as tabelas no banco de dados.

Abra o banco de dados e você vai perceber que ele criou as tabelas Menu, Tela e MenuTela que é a tabela que vai conter os Id´s de cada uma gerando um relacionamento Many-To-Many.

Até a próxima!