Início > ASP.Net e C# > Partial Class – Parte 2

Partial Class – Parte 2

No artigo anterior expliquei com que são partial class e como utiliza-las. Nessa segunda parte do artigo vamos utilizar Partial Class com Entity Framework.

Para esse exemplo criei 3 tabelas em uma base de dados SQL Server, o script está logo abaixo:

CREATE TABLE [dbo].[UF](
	[CD_UF] [nchar](2) NOT NULL,
	[DS_UF] [nchar](10) NULL,
 CONSTRAINT [PK_UF] PRIMARY KEY CLUSTERED
(
	[CD_UF] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

CREATE TABLE [dbo].[MUNICIPIO](
	[CD_MUNICIPIO] [numeric](10, 0) NOT NULL,
	[NM_MUNICIPIO] [varchar](100) NULL,
	[CD_UF] [nchar](2) NULL,
 CONSTRAINT [PK_MUNICIPIO] PRIMARY KEY CLUSTERED
(
	[CD_MUNICIPIO] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

SET ANSI_PADDING OFF
GO

ALTER TABLE [dbo].[MUNICIPIO]  WITH CHECK ADD  CONSTRAINT [FK_MUNICIPIO_UF] FOREIGN KEY([CD_UF])
REFERENCES [dbo].[UF] ([CD_UF])
GO

ALTER TABLE [dbo].[MUNICIPIO] CHECK CONSTRAINT [FK_MUNICIPIO_UF]
GO

CREATE TABLE [dbo].[PESSOA](
	[CD_PESSOA] [numeric](10, 0) NOT NULL,
	[NM_PESSOA] [varchar](100) NULL,
	[CD_MUNICIPIO] [numeric](10, 0) NULL,
 CONSTRAINT [PESSOA_PK] PRIMARY KEY CLUSTERED
(
	[CD_PESSOA] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

SET ANSI_PADDING OFF
GO

ALTER TABLE [dbo].[PESSOA]  WITH CHECK ADD  CONSTRAINT [PESSOA_MUNICIPIO_FK] FOREIGN KEY([CD_MUNICIPIO])
REFERENCES [dbo].[MUNICIPIO] ([CD_MUNICIPIO])
GO

ALTER TABLE [dbo].[PESSOA] CHECK CONSTRAINT [PESSOA_MUNICIPIO_FK]
GO

Insira alguns valores nessa tabela para utilizarmos em nosso exemplo.

Com valores preenchidos, abra o Visual Studio e crie um projeto do tipo Library Class em C#. Coloquei o nome do projeto de PartialClassWithEntity. Clique com o botão direito sobre o projeto em Add New Item selecione ADO.NET Entity Data Model. Chamei o arquivo de Partial.edmx.

Em Entity Data Model selecione Generate from database e clique em next. Na próxima tela você precisa selecionar a conexão com a base de dados que criamos nossas tabelas anteriormente. Talvez seja necessário você criar a conexão. Com a conexão criada marque a opção – Yes, include the sensitive data in the connection string – e a opção Save entity connection settings in App.Config as e coloque um nome para sua conexão entity no meu caso está PartialEntity e clique em next.

Na próxima tela selecione as 3 tabelas que criamos anteriormente e clique em Finish para que as entidades sejam criadas conforme a imagem abaixo.

Com o projeto Library pronto vamos adicionar outro projeto a solução clique na solution e em add new project.

Selecione um projeto do Tipo Console em C# com o nome de ConsolePartial. Com o projeto criado clique com o botão direito sobre ele e em Add Reference, selecione a guia Projects e o projeto PartialClassWithEntity que possui o Entity Framework.

Volte em Add new Reference, porém selecione a guia NET e selecione a biblioteca System.Data.Entity. Também copie o arquivo App.config do projeto PartialClassWithFramework para o projeto ConsolePartial (copie não recorte).

No arquivo Program.cs escreva o seguinte código:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using PartialClassWithEntity;

namespace ConsolePartial
{
    class Program
    {
        static void Main(string[] args)
        {
            using (PartialEntity ef = new PartialEntity())
            {
                IQueryable iqbPessoa = from p in ef.PESSOA select p;

                foreach (PESSOA p in iqbPessoa)
                {
                    Console.WriteLine(string.Format("Nome Pessoa: {0} - Município/UF: {1}", p.NM_PESSOA, p.MUNICIPIO.NM_MUNICIPIO));
                }
            }
            Console.Read();
        }
    }
}

Executando o código será possível visualizar os dados que inserimos na tabela PESSOA, porém veja que não conseguimos trazer a descrição da UNIDADE FEDERATIVA (UF). É claro que podemos concatenar a descrição da unidade federativa como no exemplo abaixo:

Console.WriteLine(string.Format("Nome Pessoa: {0} - Município/UF: {1} - {2}", p.NM_PESSOA, p.MUNICIPIO.NM_MUNICIPIO, p.MUNICIPIO.UF.DS_UF));

Porém e se a entidade PESSOA já tivesse uma propriedade com o nome do município concatenado com o nome da unidade federativa?

Volte ao projeto PartialClassWithEntity (nosso projeto Library) e crie uma nova class chamada PESSOA, a classe deve ser criada conforme abaixo:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace PartialClassWithEntity
{
    public partial class PESSOA
    {
        public string NM_MUNICIPOUF
        {
            get { return MUNICIPIO.NM_MUNICIPIO + " - " + MUNICIPIO.UF.DS_UF; }
        }
    }
}

Veja que criamos uma propriedade chamada NM_MUNICIPIOUF que quando realizamos o get, ele concatena os campos NM_MUNICIPIO E DS_UF. Compile o projeto class e altere o projeto console com a linha abaixo:

Console.WriteLine(string.Format("Nome Pessoa: {0} - Município/UF: {1}", p.NM_PESSOA, p.NM_MUNICIPOUF));

Pronto, através da partial class criamos uma nova propriedade para nossa class do entity framework, sendo que essa propriedade não faz relação com nenhuma coluna da tabela PESSOA. Podemos criar outras propriedades que podem ser úteis, utilizo partial em várias vezes em projeto com EF.

Lembre que a class partial deve estar na mesma namespace da classe principal senão o compilador vai entender como sendo duas classes diferentes. Outro detalhe importante, veja que o foreach está dentro do Using, isto porque para que nossa propriedade NM_MUNICIPOUF seja populada o Entity precisa estar aberto, caso ele esteja fechado um exception irá acontecer. Veja abaixo a maneira de como o código não irá funcionar.

        static void Main(string[] args)
        {
            IQueryable<PESSOA> iqbPessoa = null;

            using (PartialEntity ef = new PartialEntity())
            {
                iqbPessoa = from p in ef.PESSOA select p;
            }

            foreach (PESSOA p in iqbPessoa)
            {
                Console.WriteLine(string.Format("Nome Pessoa: {0} - Município/UF: {1}", p.NM_PESSOA, p.NM_MUNICIPOUF));
            }

            Console.Read();
        }

Executando o código acima uma exception (The ObjectContext instance has been disposed and can no longer be used for operations that require a connection.) será exibida.

Espero que tenha gostado e até a próxima.

Anúncios
  1. Nenhum comentário ainda.
  1. No trackbacks yet.

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s

%d blogueiros gostam disto: