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. Um Setor possui quantos empregados?
R: no mínimo 1 e no máximo N. |
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="Data Source=.\SQLEXPRESS;AttachDbFilename=C:\dados\Cadastro.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True;MultipleActiveResultSets=True"" 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:
Seção Entity Framework do site (diversos artigos sobre o Entity Frarmework)