Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

RSS iMasters

[Resolvido] Entity Frameweork 4 - Usando POCO, Code First e as convenç

Recommended Posts

Está prevista, ainda para oprimeiro semestre deste ano, uma nova versão do Entity Framework4, com o objetivo de tornar a ferramenta cadavez melhor.

 

Enquanto a versão final não sai, vamos falar um pouco sobre uma das suas últimas atualizações, a Entity Framework Feature Community Technology Preview - CTP5, mais precisamente da funcionalidade Code-First e POCO.

 

Obs: Para baixar a versão CTP5 aqui: http://tinyurl.com/5rg52tg

 

Nota: Aversão anterior, a CTP4, já permitia usar o recurso doFirst-Code com um banco de dados existente mas exigia maisintervenção do desenvolvedor com a CTP5 tudo ficou maissimples.

 

O Entity Framework é uma ferramentaOR/M que realiza o mapeamento objeto relacional gerando entidadese mapeando-as para as tabelas do banco de dados.. Em sua primeira versão, praticamente não havia o que é conhecido como Code-First(Código Primeiro), ou seja, a possibilidade degerar o modelo de negócios e suas entidades sem ter que primeirocriar o banco de dados.

 

Para quem trabalha usando oparadigma da orientação a objetos deveria ser natural iniciar odesenvolvimento pelo modelo de entidades, onde as classes sãodefinidas para representar o domínio do negócio.Posteriormente, e a partir destas classes, seria gerado o bancode dados usado pela aplicação para realizar a persistência dasinformações. Deveria ser assim, mas a primeiraversão do EF não permitia esse recurso.

 

Tentando contornar este problemaeram feitos certos malabarismos, mas ainda assim, haviauma dependência muito forte do mapeamento gerado pelo EF4 atravésdo Entity Data Model, o que incomodava muitagente. Até que a Microsoft liberou atualizações que permitem maior independência do Framework, através dacriação de classes POCO (Plain Old CLR Objects) que não herdam das classes basegeradas pelo EF.

 

Quando decidimos usar o Code-Firstnão precisamos começar nossa aplicação criando o banco dedados ou definindo um esquema mas podemos iniciar escrevendoclasses .NET para definir o modelo de objetos do nosso domíniosem ter que misturar a lógica de persistência de dados com asclasses.

 

O Entity Framework, por padrão, adotaalgumas convenções (Conventions) que ele usapara realizar algumas operações.

 

 

Mas o que são essas convenções?

Consultando o dicionário teremos aseguinte definição: Acordo, pacto,contrato: convenção verbal , aquilo que está geralmenteadmitido ou tacitamente contratado.

 

Em nosso contexto, podemos dizer queuma convenção é uma regra padrão pelo qual não teremos quefazer algumas configurações de mapeamento para nossasentidades, sendo que o EF4 vai , baseado nessas convenções,realizar as tarefas de forma automática.

 

Na CTP5 , as convenções estãodefinidas por uma hierarquia de subclasses que implementam umcontrato comum chamado IConvention. Uma simplesdefinição deste contrato pode ser visto no código abaixo:

 

C#

 

public interface IConvention

{

}VB .NET

 

Public Interface IConvention

End InterfaceDebaixo de IConventiontemos elementos como AttributeConfigurationConvention,IDbConvention e IEdmConvention que nos interessam mais,uma vez que eles representam os contratos através dos quaisforam implementadas as diversas convenções.

 

Antes de entrarmos em detalhes sobre as Convenções, criaremos um exemplo no EF4, para mostrar como ele se comportausando as convenções padrão, para entendermos o seucomportamento e assim alterá-lo se assim desejarmos.

 

 

CTP5- Usando POCO com as convenções padrão

Se usarmos o EF para realizar omapeamento criando o Entity Data Model teremosuma grande ajuda da ferramenta, mas em muitos casos isso ao invésde ajudar acabará atrapalhando, pois o código verboso gerado podeser um problema para integrar com o nosso modelo ou mesmotransmitir usando Web Services.

 

Vamos então mostrar como usar POCOsem criar o Entity Data Model e também usar o Code-Firstgerando o banco de dados e as tabelas a partir de nossasentidades.

 

 

Mas o que são essas classes POCO?

POCO - Plain Old CLR Object - são classes simples de domínio que possuem apenas get/sets e um construtor e que não dependem de nenhum framework; as classes POCO não são obrigadas a herdar de nenhuma outra classe ou implementar nenhuma interface.Portanto as classes POCO  são independente de frameworks.

 

Vamos iniciar criando o nosso modelode negócio através da definição das classes do nossodomínio. Para tornar a tarefa mais suave e de fácilentendimento adotaremos um modelo simplificado que pode ser vistono diagram de classes a seguir:

 

36374.png

 

A cardinalidade é umconceito importante para ajudar a definir o relacionamento, eladefine o número de ocorrências em um relacionamento. Paradeterminar a cardinalidade, deve-se fazer a pergunta relativa aorelacionamento em ambas as direções. No exemplo a seguir, temos

 

  • Um Curso possui quantos alunos?  R: no mínimo 1 e no máximo N;
  • Um aluno está alocado em quantos cursos? R- no mínimo em 1 e no máximo em 1;

Para implementar o nosso exemplo, usaremos o VisualBasic 2010 Express Edition ecriando um novo projeto chamado EF4_Poco_Escolavia menu File->New Project escolhendo otemplate Windows Forms Application;

 

Obs: Vocêvai precisar ter instalado o SQL Server 2005 ou 2008 ExpressEdition.

 

No menu Projectclique em Add Reference. Selecione a guia Browse e localize adll EntityFramework na pasta onde foi instaladaa CTP5 (c:Arquivos Programas)

 

36375.gif

 

Os recursos da EF Code FirstCTP5 tem um nome de assembly atualizado e novonamespace .NET:

 

  • Nome do Assembly: EntityFramework.dll
  • Namespace: System.Data.Entity

No formulário form1.vb vamosdefinir uma interface bem simples apenas para exibir as mensagensdurante a execução do código. Inclua um controle ListBox (lstResultado)e um botão de comando (btnExecutar) conforme o layoutda figura abaixo:

 

36376.gif

 

 

Definindoas classes de negócio

Vamos definir as classes Curso eAluno no projeto da seguinte forma:

 

1 - No menu Project selecione AddClass e informe o nome Modelo.vb eclique no botão Add.

 

36378.gif

 

A seguir defina as classes Cursoe Aluno no arquivo Modelo.vb conforme ocódigo abaixo:

 

Public Class Curso

 

Private m_CursoId As Integer

Public Property CursoId() As Integer

Get

Return m_CursoId

End Get

Set(ByVal value As Integer)

m_CursoId = valu

End Set

End Property

 

Private m_nome As String

Public Property Nome() As String

Get

Return m_nome

End Get

Set(ByVal value As String)

m_nome = value

End Set

End Property

 

Private m_escolaid As Integer

Public Property EscolaId() As Integer

Get

Return m_escolaid

End Get

Set(ByVal value As Integer)

m_escolaid = value

End Set

End Property

 

Public Property Alunos() As ICollection(Of Aluno)

Get

Return m_Alunos

End Get

Set(ByVal value As ICollection(Of Aluno))

m_Alunos = value

End Set

End Property

Private m_Alunos As ICollection(Of Aluno)

End Class

 

Public Class Aluno

 

Private m_AlunoId As Integer

Public Property AlunoId() As Integer

Get

Return m_AlunoId

End Get

Set(ByVal value As Integer)

m_AlunoId = value

End Set

End Property

 

Private m_nome As String

Public Property Nome() As String

Get

Return m_nome

End Get

Set(ByVal value As String)

m_nome = value

End Set

End Property

 

Private m_Email As String

Public Property Email() As String

Get

Return m_Email

End Get

Set(ByVal value As String)

m_Email = value

End Set

End Property

 

Public Property Curso() As Curso

Get

Return m_curso

End Get

Set(ByVal value As Curso)

m_curso = value

End Set

End Property

Private m_curso As Curso

 

End Class2 - No menu Projectselecione Add Class e informe o nome AcessoDados.vbe clique no botão Add.

 

Vamos definir a classe AcessoDadosque herda de DbContext e utilizar:

 

Imports System.Data.Entity

 

Public Class AcessoDados

 

Public Class ContextoCurso

Inherits DbContext

 

Private m_Cursos As DbSet(Of Curso)

Public Property Cursos() As DbSet(Of Curso)

Get

Return m_Cursos

End Get

Set(ByVal value As DbSet(Of Curso))

m_Cursos = value

End Set

End Property

 

Private m_Alunos As DbSet(Of Aluno)

Public Property Alunos() As DbSet(Of Aluno)

Get

Return m_Alunos

End Get

Set(ByVal value As DbSet(Of Aluno))

m_Alunos = value

End Set

End Property

End Class

 

End ClassUm dos aprimoramentos digno de nota é que o CTP5 é uma versão simples das duas classes:

 

- ObjectContext permite consultar, controle de alterações e salvar no banco de dados.

- ObjectSet encapsula os conjuntos de objetos semelhantes.

 

O DbContext é um invólucro para ObjectContext e além disso esta classe contém:

 

- Um conjunto de APIs que são mais fáceis de usar do que a exposta pelo ObjectContext;

- As APIs que permitem utilizar o recurso do Code-First e as convenções;

 

O DbSet é um invólucro para ObjectSet.

 

Definindo o código para executar acriação das tabelas do banco de dados e a persistência dosdados. Vamos agora definir o código noformulário form1.vb no evento Clickdo botão de comando vamos chamar a rotina geraTabelasBD:

 

Private Sub btnExecutar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnExecutar.Click

geraTabelasBD()

End SubO código da rotina geraTabelasBDé visto a seguir:

 

 

Private Sub geraTabelaBD()

 

lstResultado.Items.Clear()

lstResultado.Items.Add("Gerando as tabelas e o banco de dados")

Using contextoCurso As New ContextoCurso()

 

Dim curso As New Curso() With {

.Nome = "Entity Framework",

.EscolaId = 100

}

 

lstResultado.Items.Add("")

lstResultado.Items.Add("Entidade Curso criada com sucesso: nome='Entity Framework', Escolaid=100")

 

contextoCurso.Cursos.Add(curso)

 

lstResultado.Items.Add("")

lstResultado.Items.Add("O curso foi incluído na coleção Cursos")

 

Dim macoratti As New Aluno() With

{

.Nome = "Jose Carlos Macoratti",

.Curso = curso,

.Email = "macoratti@yahoo.com"

}

 

lstResultado.Items.Add("")

lstResultado.Items.Add("Entidade Aluno criada com sucesso: nome='Jose Carlos Macoratti'")

 

contextoCurso.Alunos.Add(macoratti)

 

lstResultado.Items.Add("O aluno foi incluído na coleção Alunos")

 

Dim registros As Integer = contextoCurso.SaveChanges()

 

lstResultado.Items.Add("As entidades foram persistidas")

lstResultado.Items.Add("")

lstResultado.Items.Add("Registros afetados :" + registros.ToString())

 

End Using

End SubExecutando o projeto e clicando nobotão iremos obter o seguinte resultado:

 

36379.gif

 

Feito isso, vamos verificar como oEntity Framework se comportou e quais as operações que elerealizou. Agora vamos dar uma olhada no SQL Serverinstalado na máquina local através do SQL ServerManagement Studio.

 

Na figura abaixo vemos que o bancode dados EF4_Poco_Escola.AcessoDados+ContextoCursofoi criado. Foram criadas também as tabelas Alunose Cursos e também foram persistidas os dados conformemostra a figura a seguir:

 

Obs: Onome das tabelas geradas foram Alunoes e Cursoes. O EF4 aplicouuma convenção baseada na gramática inglesa que cria a tabelacom o nome da classe no plural.(*)

 

36380.gif

 

O conteúdo as tabelas Cursos e Alunos exibindo os dados incluídos:

 

36381.gif

 

Partindo das nossas classes POCO,o EF4 - CTP5 realizou todo o trabalho de criação dobanco de dados e das tabelas e também da persistência dasinformações.

 

Resumindo o que o EF4 fez:

 

  • Se conectou a uma instãncia do SQL Server na máquina local (.SQLEXPRESS) usando a autenticação do Windows;
  • Verificou a existência do banco de dados com o nome qualificado da classe que herda de DbContext;
  • Descobriu as propriedades das classes Aluno e Curso;
  • Inferiu a existência do relacionamento um-para-muitos entre a classe Curso e a classe Aluno;
  • Criou as tabelas Alunos e Cursos com os tipos e os relacionamentos pertinentes;
  • Inclui os dados em cada uma das tabelas executando o comando SaveChanges();

Caramba! Como ele sabe fazer tudoisso sozinho?

Elementar meu caro, ele usa asconvenções pré-definidas.

 

 

E quais seriam então essasconvenções?

Segue um resumo :

 

  1. Se você não definir um endereço para o servidor , o EF4 CTP5 irá tentar realizar uma conexão local;
  2. O nome da tabela criada será o nome da classe no plural (usando a sintaxe da gramática da língua Inglesa.No exemplo: Alunoes e Cursoes);
  3. Se não for definido um nome para o banco de dados , ele será criado com o nome do projeto mais o nome da classe do contexto;
  4. Se uma classe tem uma propriedade de navegação para outra classe e esta possuir uma coleção da primeira, o EF infere que existe um relacionamento do tipo um-para-muitos entre as classes;
  5. Se existe uma propriedade com nome igual ao nome da classe mas termina em Id ('nomeClasse'+Id) ou se o nome da propriedade é apenas Id esta propriedade será a chave primária;
  6. Se a chave primária é do tipo inteiro ele é do tipo Identity;

Você pode alterar as convençõespadrão definindo suas próprias convenções e assim ter ummaior controle sobre as tarefas realizadas mas isso é um assuntopara outro artigo.

 

Pegue o projeto completo em:  EF4_Poco_Escola.zip (versão VB .NET) e EF4_Poco_Conventions.zip (Versão C#)

 

Eu sei é apenas EF, mas eugosto...

 

 

 

http://imasters.com.br/artigo/20727/dotnet/entity-frameweork-4-usando-poco-code-first-e-as-convencoes-padrao

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.