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
Qualquer dúvida, opinião, reclamação mande seu comentário!
Um Abraço!
Ainda tenho algumas dúvidas quanto a manutenibilidade quando se usa o Code First. Vi alguns exemplos e, ok, você consegue mapear para copiar os dados em caso de alteração do modelo. Mas é um processo tão braçal que aí já começo a pesar o ganho de tempo inicial. E alterações no modelo (aka nas tabelas do banco), pelo menos nos projetos que costumo trabalhar, é algo extremamente recorrente.
Leandro, estava lendo o seu exemplo e susrgiu uma dúvida quando você escreveu Carro no Model e se em vez de MarcaID o nome do atributo fosse somente ID exatamente igual ao nome de ID da classe Carro, o gerador entenderia esse realacionamento entre classes ?
Paulo
Sim, o EF iria entender sua chave, porém vc teria que colocar o annotation [key] sobre seu atributo chave
att,
Leandro Prado
Estou seguindo seu tutorial mas na hora de criar o controller aparece esse erro: “There was an error generating ‘TesteCodeFirst.Models.TesteCodeFirstContext’. Try rebuilding your project.”, encontrei problema dizendo sobre um Entity Framework CTP5 instalado, mas esse não é meu caso. Você teria alguma solução? Já passou por isso, sabe o que pode estar acontecendo? Obrigado.
Rapaz, descobri onde estava ocorrendo o problema precisava instalar os assemblies de referência do Entity Framework 4.1, no menu Package Manager Console, utilizar o install-package EntityFramework, (http://msdn.microsoft.com/en-us/data/gg685467)
Muito bom seu tutorial, obrigado.
maravilha!!!
att,
Leandro Prado
Boa Tarde Leandro,
Tenho uma dúvida. Com a geração automática dos meus métodos CRUD, o desenvolvedor ainda terá liberdade de criar Generic Repository Pattern ? Ou já não há mais necessidade de implementar este Pattern?
Jean,
Geralmente uso somente essa geração automática para sistemas que são de baixa complexidade e que não precisam de uma arquitetura muito complexa
Agora se seu sistema foi de alta complexidade e alta disponibilidade é sempre bom usar as melhores práticas de programação e isso inclui usar os patterns (Repository, Singleton, etc…)
att,
Leandro Prado
Obrigado pela resposta!
Abraço,
Jean Paulo
Olá Leandro, o EF tem suporte a Fluent?
Se sim, você teria algum exemplo?
abs
Marlon
Sim! o EF possui suporte a Fluent
Veja a documentação no MSDN – http://msdn.microsoft.com/en-us/library/hh295844(v=vs.103).aspx
att,
Leandro Prado
Olá, estou estudando Asp Net MVC, e tratando padrões de desenvolvimentos com o exemplo abaixo. A minha duvida é como faria para adicionar mascara de telefone, cpf, data, a exemplo de data [DisplayFormat(DataFormatString=”dd/mm/yyyy”)], mas o mesmo não gera a mascara na view( na pagina), gostaria que logo com o input no caso da data ja fosse aparecendo as barras ou se não os pontos ( / / / ou se . . .) logo que fosse colocado a informação, e assim por diante. A pergunta é como faço isso, e o que preciso para que isso aconteça, isso é possivel ser feito na Model como estou fazendo?
Pois como visto abaixo: os nomes do campo, as validações, tamanho do campo, limite de caracteres e outros, estou fazendo no Model.
using System.ComponentModel.DataAnnotations;
namespace SisCadastro.Models
{
[Table(“Departamento”)]
public class Departamento
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int DepID { get; set; }
[Required(ErrorMessage=”Por favor preencha o campo Nome *”)]
[Display(Name=”Nome *”)]
[StringLength(50,ErrorMessage=”Limite máximo de 50 caracteres”)]
[DataType(DataType.Text)]
public string Nome { get; set; }
public ICollection Funcionarios { get; set; }
[Display(Name=”Data do Cadastro”)]
[DisplayFormat(DataFormatString=”dd/mm/yyyy”)]
public DateTime DataCadastro { get; set; }
}
}
João,
Para adicionar mascaras em seus inputs, use o JQuery
att,
Leandro Prado
Leandro,
A um tempo atrás, em um trabalho de faculdade, segui o passo a passo e consegui desenvolver esse projeto TesteCodeFirst, mas lembro que nesse passo a passo, tinha também a criação da base de dados utilizando o próprio VS 2010.
Atualmente estou me dedicando mais a projetos em .NET MVC3 e resolvi refazer o projeto e segui o passo a passo novamente, mas acho que estou no post errado ou estou fazendo algo errado (o que deve ser mais provavel. rss)
Ao seguir cada passo, eu estou esbarrando em um problema ao criar o Controller, pois na janela não está habilitando para escolher o Models “Marca” ou “Carro”, ao invés de habilitar a combo, aparece um (x) vermelho dizendo que não existe Models.
Resolvi então baixar o projeto pronto e rodar para fazer alterações e estou esbarrando no erro abaixo ao clicar em qualquer opção do menu.
Acredito que seja alguma coisa na parte da base de dados.
Valeu pela ajuda,
Luis Domingues
Luis,
Parece ser algo do seu Visual Studio, vc ja tentou fazer um Rebuild do projeto?
att,
Leandro Prado
Tive um pequeno problema quando segui o tutorial, após os procedimentos apareceu no browser a seguinte mensagem quando fui acessar a view referente ao controller que criei:
CREATE DATABASE permission denied in database ‘master’.
O que poderia ser e como poderia remediar a situação?
Carlos,
O usuário que está conectando ao banco de dados tem permissão para criar databases?
Eu ja passei por um erro desses, e a solução foi criar manualmente o banco de dados, ai o EF depois criou as tabelas automaticamente
att,
Leandro Prado
Belezinha Leandro nao estou conseguindo fazer a Foreing Key ja setei pelo banco porem nao aparece em dropdownlist ou algo do tipo … gostaria que passasse algum material tbm para foreing keys em Code firts grato Kevin