ASP NET MVC 3 com Entity Framework Code First

Semana passada saiu uma nova versão do ASP NET MVC com algumas atualizações, e uma delas é a versão final do Entity Framework 4.1 que já inclui o code first, para mais detalhes veja esse post do Scot Gu

O que me chamou mais atenção foi o Data Scaffolding que permite criar telas CRUD de maneira muito fácil e também o Code First que permite criar a base de dados através de suas classes POCO, vamos a um pequeno exemplo

1- Atualizar o ASP NET MVC 3

Primeiro de tudo temos que atualizar o ASP NET MVC 3 (é claro) baixe o arquivo clique aqui

2- Criar um novo projeto

Abra o VS2010 e clique em File -> New Project e depois selecione Visual c# -> Web e selecione o template ASP.NET MVC 3 Web Application adicione um nome ao projeto e depois clique em OK

Na próxima tela podemos ver que temos um novo template de projeto que é Intranet Application que ja vem configurado para usar Windows Authentication, nesse exemplo vamos usar o template Internet Application e também temos a opção de usar HTML 5

3- Criando o model

Agora vamos criar nosso model Marca, clique com o botão direito sobre a pasta Models e selecione a opção Add -> Class

[sourcecode language=”csharp”]
public class Marca
{
public int MarcaID { get; set; }
public string Nome { get; set; }
public virtual ICollection Carros { get; set; }
}
[/sourcecode]

Agora nosso model Carro

[sourcecode language=”csharp”]
public class Carro
{
public int ID { get; set; }
public string Nome { get; set; }
public int MarcaID { get; set; }
public int QtdePortas { get; set; }
public string Cor { get; set; }
public Decimal Valor { get; set; }
public virtual Marca Marca { get; set; }
}
[/sourcecode]

Observação

Veja que na classe Carro temos um propriedade MarcaID que esta referenciando a nossa propriedade MarcaID da classe Marca, o correto seria ter apenas a propriedade Marca e essa ja fazer a referência, porém nessa versão do entitity framework temos que fazer essa referência explicitamente para que as tabelas possam ser criada corretamente com a FK. Essa questão ja foi levantada no blog do Scott Gu, veja abaixo:

@kaa,

>>>>>>> Argh, that CategoryId on the Product class in the given example is still a show-stoppper for me.  Can’t we come up with some better way for the scaffolding framework to figure that out? Entity Framwork doesn’t need it, why should I have to put extra properties on a POCO just to satisfy the tooling? I like the promise of scaffolding too much not to care about this…

Unfortunately we needed to require this in the first scaffolding iteration because of time constraints – I expect it will be removed as a requirement in the future.  I’d recommend checking out Steve Sanderson’s MvcScaffolding templates – I think those don’t require it.

Hope this helps,

Scott

4- Criando o contexto

Para o Entity Framework se conectar a base de dados, temos que criar um contexto, vamos criar uma nova classe chamada TesteCodeFirstContext que herda de DbContext, veja abaixo

[sourcecode language=”csharp”]
public class TesteCodeFirstContext : DbContext
{
public DbSet Marcas { get; set; }
public DbSet Carros { get; set; }
}
[/sourcecode]

5- Criando o scaffold Marca

Primeiramente vamos criar o controller Marca, clique com o botão direito sobre a pasta Controllers e selecione a opção Add -> Controller

Veja que a janela para criação do controller mudou bastante, agora temos várias opções

Controller Name: Nome do nosso controller, nesse caso MarcaController

Template: Podemos selecionar qual template queremos para nosso controler, nesse caso selecionamos que vamos usar a leitura e gravação e páginas usando o Entity Framework

Model Class: Temos que selecionar qual model esse controller representa, nesse caso Marca que criamos acima

Data Context Class: É a nossa classe de contexto, nesse caso TesteCodeFirstContext que criamos acima

Views: Como será criado as páginas, se é usando Razor ou ASPX

Depois clique em Add, veja que foi criado o controller MarcaController com todos os métodos CRUD ja acessando a base de dados usando Entity Framework. E mais… ja foram criadas todas as views

6- Configurando o banco

Agora temos que configurar como o entity framework vai conectar a base de dados, por default não precisamos configurar uma Connection String no web.config apontando para o nosso banco, se não for especificado o entity framework vai procurar uma base no SQLExpress com o mesmo nome da nossa classe de contexto, ou seja, TesteCodeFirstContext.

Se quiser especificar uma base explicitamente temos que configurar uma Connection String no arquivo web.config com o mesmo nome da nossa classe de contexto, nesse caso TesteCodeFirstContext, porém colocamos o nome da base diferente do nosso contexto, veja abaixo o exemplo:

[sourcecode language=”xml”]
<connectionStrings>
<add name="TesteCodeFirstContext" connectionString="Data Source=TECHNOTE65;Initial Catalog=TesteEF;Integrated Security=True" providerName="System.Data.SqlClient"/>
</connectionStrings>
[/sourcecode]

7- Executar o projeto

Agora mande executar o projeto (F5) e entre em nosso controller Marca (http://localhost:4240/Marca) nesse momento o EF vai verificar se ja existe a base, se não existe, ele cria a base e as tabelas.

Veja que a nossa página ja está criada e já temos a opção de Create

Tela de Create

Tela inicial com as opções de Edit | Details | Delete

8- Criando o scaffold Carro

Seguir os mesmos passos que para o scaffold Marca, porém alterando para o model Carro, veja abaixo:

Veja que também foi criado todo o CRUD para o model Carro

9- Executar o projeto

Agora mande executar o projeto novamente (F5) e entre em nosso controller Marca (http://localhost:4240/Carro)

Tela Create New

Veja que o campo Marca ja vem como uma DropDownList para selecionar as marcas que ja cadastramos anteriormente, veja a tela de listagem abaixo:

Essa versão ja melhorou muito, mas creio que ainda temos muitas coisas para melhorar como fazer as referências de FK

Download do projeto

Qualquer dúvida, opinião, reclamação mande seu comentário!

Um Abraço!

Sobre Leandro Prado

Leandro Silveira Prado é Premier Field Engineer na Microsoft especializado em Application Lifecycle Management.