Pílula de Entity Framework 4 - Usando o Model First e POCO


Neste artigo eu vou mostrar o Model First e POCO dois conceitos importantes para quem deseja usar o Entity Framework em suas aplicações de acesso a dados.

Lembrando que a nova versão do Entity Framework (chamada aqui de versão 4.0) esta disponível a partir da versão 4.0 da .NET Framework.

Para este artigo eu estou usando o Visual Basic 2010 Express Edition que é uma versão gratuita e funcional que também possui o Entity Framework.

Em meu artigo - EF - First Model - Gerando o banco de dados a partir do modelo - eu apresentei o recurso Model First e mostrei como gerar o banco de dados a partir do modelo conceitual.

Neste artigo eu irei criar um modelo de entidades usando o Model First, com uma associação que representa um relacionamento um-para-muitos usando classes POCO que não terão nenhuma dependência do Entity Framework.

Relacionamento um-para-muitos :   O relacionamento um-para-muitos é usado quando uma entidade A pode se relacionar com uma ou mais entidades B.  Este relacionamento é representado pelo sinal: 1:N que expressa a cardinalidade do relacionamento.

A cardinalidade é um conceito importante para ajudar a definir o relacionamento, ela define o número de ocorrências em um relacionamento.
 Para determinar a cardinalidade, deve-se fazer a pergunta relativa ao relacionamento em ambas as direções. No exemplo a seguir, temos

Um Setor possui quantos empregados?  R: no mínimo 1 e no máximo N.
Um empregado está alocado em quantos setores? R- no mínimo em 1 e no máximo em 1

A versão anterior do Entity Framework não dava suporte a POCOs, pelo menos sem ter que fazer nenhuma gambiarra, visto que o EF na sua primeira versão gerava as classes de domínio. A nova versão do Entity Framework dá suporte total ao POCOs e isso eu  mostrar neste artigo.

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.

Criando um modelo de entidades

Crie um novo projeto no VB 2010 Express Edition do tipo Console Application com o nome EF_FirstModel_POCO;

A seguir no menu Project selecione Add New Item e a seguir selecione o template ADO .NET Entity Data Model informando o nome Teste.edmx e clicando no botão Add;

A seguir selecione a opção Empty model pois iremos criar o nosso modelo definindo as entidades no descritor do EDM;

Fazemos esta escolha pois vamos tratar com classes e objetos e não com linhas/registros de banco de dados , nem com índices, chaves , etc.

Agora podemos usar a ToolBox e definir duas entidades arrastando o objeto Entity para o descritor e definindo as propriedades escalares conforme a figura abaixo:

Nota: Para incluir uma nova propriedade escalar clique com o botão direito do mouse sobre a entidade e selecine Add -> Scalar Property;

Antes de prosseguir clique em uma área vazia do descritor e na janela de Properties vamos desabilitar a geração de código definindo Code Generation como None;

A seguir clique novamente na área vazia do descritor com o  botão direito do mouse e selecione Add -> Association;

Em seguida defina a associação entre as entidades Categoria e Produto conforme a figura abaixo:

O resultado final deverá ser exibido conforme a figura abaixo onde vemos a associação entre as entidades e as Navigation Properties : Produtos que retornam uma coleção de produtos e Categoria que retorna uma instância de Categoria;

Vamos agora gerar o banco de dados a partir do nosso modelo clicando com o botão direito do mouse sobre a área vazia do descritor r selecionando a opção : Generate DataBase from Model...

O assistente vai abrir uma janela solicitando que você defina uma conexão com um banco de dados existente. Selecione a conexão mais adequada ao seu caso no meu caso eu já havia criado um banco de dados chamado Cadastro.mdf e escolhi a conexão com esse banco de dados.

Como resultado teremos o script SQL gerado  para ser executado e assim gerar o banco de dados e as tabelas.

Abrindo o SQL Server Management Studio e executando o script podemos ver conforme a figura abaixo as tabelas sendo criadas no banco de dados Cadastro.mdf.

Se você abrir o seu arquivo App.Config irá notar a string de conexão que na verdade é uma string de conexão com a entidade (EntityConnection):

Para o meu caso a string de conexão é vista abaixo:

<connectionStrings>

<add name="TesteContainer" connectionString="metadata=res://*/Teste.csdl|res://*/Teste.ssdl|res://*/Teste.msl;provider=System.Data.SqlClient;provider connection string=&quot;Data Source=.\SQLEXPRESS;AttachDbFilename=C:\dados\Cadastro.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True;MultipleActiveResultSets=True&quot;" providerName="System.Data.EntityClient" />

</connectionStrings>
</
configuration>

O próximo passo e criar as nossas classe POCO Categoria e Produto. Para isso usaremos o menu Project -> Add Class para criar a classe Categoria no arquivo Categoria.vb e a classe Produto no arquivo Produto.vb conforme o código abaixo:

1- A classe Categoria

Public Class Categoria
    Private _categoriaId As Integer
    Public Overridable Property categoriaId() As Integer
        Get
            Return (_categoriaId)
        End Get
        Set(ByVal value As Integer)
            _categoriaId = value
        End Set
    End Property

    Private _nomeCategoria As String
    Public Overridable Property nomeCategoria() As String
        Get
            Return _nomeCategoria
        End Get
        Set(ByVal value As String)
            _nomeCategoria = value
        End Set
    End Property
    Private _produtos As IList(Of Produto) = New List(Of Produto)()
    Public Overridable Property Produtos() As IList(Of Produto)
        Get
            Return Me._produtos
        End Get
        Set(ByVal value As IList(Of Produto))
            Me._produtos = value
        End Set
    End Property
End Class

2- A classe Produto

Public Class Produto

    Private _produtoId As Integer
    Public Overridable Property produtoId() As Integer
        Get
            Return _produtoId
        End Get
        Set(ByVal value As Integer)
            _produtoId = value
        End Set
    End Property
    Private _nomeProduto As String
    Public Overridable Property nomeProduto() As String
        Get
            Return _nomeProduto
        End Get
        Set(ByVal value As String)
            _nomeProduto = value
        End Set
    End Property

    Private _Categoria As Categoria
    Public Overridable Property Categoria() As Categoria
        Get
            Return (_Categoria)
        End Get
        Set(ByVal value As Categoria)
            _Categoria = value
        End Set
    End Property
End Class

Com isso, eu tenho que criar um contexto do EF. O contexto é criado pela ferramenta, mas desabilitamos o gerador de código, ele não está mais sendo criado pelo Entity Framework e teremos que fazer isso via código.

Observe que estamos herdando de ObjectContext e usando o namespace System.Data.Objects.

Imports System.Data.Objects

Public Class Contexto_EF
    Inherits ObjectContext

    Public Sub New()
        MyBase.New("name=TesteContainer", "TesteContainer")
    End Sub

    Private _categorias As IObjectSet(Of Categoria)
    Public ReadOnly Property Categorias() As IObjectSet(Of Categoria)
        Get
            If _categorias Is Nothing Then
                _categorias = CreateObjectSet(Of Categoria)()
            End If
            Return _categorias
        End Get
    End Property
End Class

Agora já podemos usar o que foi implementado. O código abaixo é apenas um dos exemplos nele eu estou criando uma nova entidade Categoria e em seguida incluindo um novo produto em Categorias para finalmente persistir as informações no contexto através do método SaveChanges().

   
        Dim context = New Contexto_EF()
        context.ContextOptions.LazyLoadingEnabled = True

        Dim categoria = New Categoria() With {.nomeCategoria = "nova Categoria", .categoriaId = 1}
        categoria.Produtos.Add(New Produto() With {.nomeProduto = "Novo Produto", .produtoId = 1, .Categoria = categoria})
        context.AddObject("Categorias", categoria)
        context.SaveChanges()

        Console.ReadKey()

 

Esta é uma pequena amostra de como usar POCOs com Entity Framework, aguarde em breve mais artigos sobre esse assunto.

Se você precisava usar POCOs em seu projeto não vai mais precisar usar outro ORM o Entity Framework agora suporta POCOs.

Eu sei é apenas Entity Framework mas eu gosto...

Referências:


José Carlos Macoratti