A maioria dos exemplos que encontramos na internet sobre Entity Framework é baseado em Model-First que é criar o mapeamento das classes através de um banco de dados já existente, porém essa abordagem não a recomendada já que nosso BD é relacional e nossas classes são orientadas a objeto. Por esse motivo a maneira correta de modelar um sistema é primeiramente criar nosso diagrama de classes e depois criar nosso DER baseado nas nossas classes, essa abordagem é chamada de Code-First.
Vamos fazer um pequeno exemplo, lembrando que não estamos seguindo nenhum padrão de codificação, é somente um exemplo!
Primeiramente vamos criar um projeto do tipo Class Library chamado EF.CodeFirst.Model, e depois adicione um novo EDMX onde vamos criar as nossas classes, para isso clique com o botão direito em cima do projeto EF.CodeFirst.Model e selecione a opção Add -> New Item -> Data -> ADO.NET Entity Data Model. Adicione o nome do DataModel e clique no botão Add.
Depois selecione a opção Empty Model e clique no botão Finish
Agora adicione as classes e relacionamentos conforme a imagem abaixo
Veja que entre as entidades Pessoa e Telefone temos um relacionamento de 1 para muitos, quando for excluir uma pessoa também temos que excluir seus respectivos telefones, para isso selecione o a associação e na propriedade End1 OnDelete mude para Cascade.
Nesse modelo temos uma classe principal chamada Pessoa onde cada pessoa pode ser Física ou Jurídica por isso criou uma herança. Cada pessoa pode ter vários Telefones onde cada telefone pode ser de um tipo (Celular, Residencial, Recados…)
Depois de criado e validado o nosso diagrama de classes vamos gerar nosso BD, para isso clique com o botão direito sobre o EDMX e selecione a opção Generate Database from Model
Configure a conexão com o seu BD e clique em Next
Aqui podemos ver o DDL – Data Definition Language, que é o script SQL para ser aplicado no BD, clique em Finish
Veja que foi criado um arquivo com o DDL, abra esse arquivo clique com o botão direito no arquivo DDL e selecione a opção Execute SQL
Veja no seu BD as tabelas que foram criadas.
Para testar nosso modelo vamos adicionar um novo projeto do tipo Test chamado EF.CodeFirst.Test e crie um novo método de testes que será responsável por criar os Tipos de telefones, veja abaixo o código.
[sourcecode language=”csharp”]
[TestMethod]
public void Adicionar_Tipo_Telefone()
{
var contexto = new ModelTesteContainer();
// Cria um tipo telefone Residencial
var objRes = new TipoTelefone()
{
Descricao = "Residencial"
};
contexto.AddToTipoTelefoneSet(objRes);
// Cria um tipo telefone Celular
var objCel = new TipoTelefone()
{
Descricao = "Celular"
};
contexto.AddToTipoTelefoneSet(objCel);
// Cria um tipo telefone Recados
var objRec = new TipoTelefone()
{
Descricao = "Recados"
};
contexto.AddToTipoTelefoneSet(objRec);
// salva os objetos
contexto.SaveChanges();
}
[/sourcecode]
Veja o resultado:
Agora vamos adicionar mais um teste para criar uma pessoa do tipo Física
[sourcecode language=”csharp”]
[TestMethod]
public void Adicionar_Pessoa_Fisica()
{
var contexto = new ModelTesteContainer();
var pessoa = new PessoaFisica();
pessoa.Nome = "Nome da pessoa fisica";
pessoa.CPF = "123.456.789-00";
pessoa.Telefone.Add(
new Telefone
{
Numero = "1111-1111",
Pessoa = pessoa,
TipoTelefone = contexto.TipoTelefoneSet.Where(t => t.Id == 1).Single(),
DDD = "41"
});
pessoa.Telefone.Add(
new Telefone
{
Numero = "9999-9999",
Pessoa = pessoa,
TipoTelefone = contexto.TipoTelefoneSet.Where(t => t.Id == 2).Single(),
DDD = "41"
});
contexto.AddToPessoaSet(pessoa);
contexto.SaveChanges();
}
[/sourcecode]
Veja o resultado
Agora para criar uma pessoa do tipo Jurídica
[sourcecode language=”csharp”]
public void Adicionar_Pessoa_Juridica()
{
var contexto = new ModelTesteContainer();
var pessoa = new PessoaJuridica();
pessoa.Nome = "Nome da pessoa juridica";
pessoa.CNPJ = "123.456.789\0001-12";
pessoa.Telefone.Add(
new Telefone
{
Numero = "2222-2222",
Pessoa = pessoa,
TipoTelefone = contexto.TipoTelefoneSet.Where(t => t.Id == 1).Single(),
DDD = "41"
});
pessoa.Telefone.Add(
new Telefone
{
Numero = "8888-8888",
Pessoa = pessoa,
TipoTelefone = contexto.TipoTelefoneSet.Where(t => t.Id == 2).Single(),
DDD = "41"
});
contexto.AddToPessoaSet(pessoa);
contexto.SaveChanges();
}
[/sourcecode]
Veja o resultado
Método para listar uma pessoa
[sourcecode language=”csharp”]
[TestMethod]
public void Obter_Todas_Pessoas()
{
var contexto = new ModelTesteContainer();
contexto.ContextOptions.LazyLoadingEnabled = true;
List<Pessoa> lst = contexto.PessoaSet.ToList<Pessoa>();
Assert.IsNotNull(lst);
}
[/sourcecode]
Lista retornada com a pessoa
O método para deletar uma pessoa.
[sourcecode language=”csharp”]
[TestMethod]
public void Deletar_Pessoa()
{
int cod = 1;
var contexto = new ModelTesteContainer();
var obj = contexto.PessoaSet.Where<Pessoa>(a => a.Id == cod).Single();
contexto.DeleteObject(obj);
contexto.SaveChanges();
}
[/sourcecode]
Dados deletados do BD
Qualquer dúvida, opinião, reclamação mande seu comentário!
Um Abraço!
muito bom artigo
http://twitter.com//jquerybrasil/
Show de bola Chico!
Abraço
gkaio
Valeu!!!
😀
att,
Leandro Prado
Por favor, criei as tabelas utilizando sql server 2008, e quando tento gerar o script para gerar as tabelas, fica dando erro, que a chave não foi criada! que não é possível restabelecer uma relação!?, Porque acontece esse erro, pois defini a ID como unique, e ate a chavinha ao lado do id, aparece? Mas fico preso criação da base de dados!
Obrigado.
Helio
Dessa forma fica bem dificil descobrir qual o motivo do erro… quando eu fui criar a chave apenas defini que ela era chave…
pode detalhar um pouco melhor o erro??
Baixe o projeto e tente comparar com o seu…
att,
Leandro Prado
O erro que ocorre é este:
Msg 911, Level 16, State 1, Line 1
Database ‘cy_Cad’ does not exist. Make sure that the name is entered correctly.
Não cria as tabelas e nem o BD cy_Cad….
Hélio,
a própria mensagem de erro diz:Database ‘cy_Cad’ does not exist. A database cy_Cad não existe
Você tem que criar a database na mão e depois rodar o DDL nessa database..
att,
Leandro Prado
Obrigado!
Achei outras explicações sobre como criar as tabelas e em nenhuma delas dizia que era preciso criar a database na mão, rsrsrsrsr. Muito obrigado, agora funcionou e foi uma dica muito valiosa.Desejo-lhe um feliz ano novo para você e sua família e boas festas! Valeu!!
Muito bom seu blog, esta de parabens, excelente conteudo
Valeu!!!
Olá,
O que você descreveu na sua matéria não seria o Model First? Já que você monta o modelo primeiro, baseado no Entity Data Model? O título do artigo refere-se ao Code first.
Code Fist não seria programar suas classes na mão? criando seu modelo apartir de classes POCO, como no link abaixo?
http://www.leandroprado.com.br/2011/05/asp-net-mvc-3-com-entity-framework-code-first/
Vlw, abraços e parabéns pelo ótimo blog.
Marcelo,
É code-first mesmo… esta certo.. porém esse método é baseado nos arquivos EDMX, onde eu criei um EDMX vazio, criei todas as classes, e depois mandei gerar o banco baseado no arquivo EDMX
Hoje esse método não é mais usado, realmente hoje trabalho com POCOS que é a melhor prática!
att,
Leandro Prado
Esse modelo é o Model-First e o outro modelo que você quis dizer que tinha bastante na internet é o Database-First, o Code First é o modelo usando poco, pelo código sem design. http://blogs.msdn.com/b/adonet/archive/2011/03/15/ef-4-1-model-amp-database-first-walkthrough.aspx ou http://stackoverflow.com/questions/5446316/ef-4-1-code-first-vs-model-database-first