Entity Framework 4 – Code First

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

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.