MAPEAMENTO UM PARA UM (1:1) COM FLUENT NHIBERNATE COM VISUAL STUDIO 2010 C#


 

Observer o cenário em um classe que herda de outra todos seus atributos, ou seja, acontece herança. Geralmente acontece bastante com cadastro aonde possue pessoa fisica e pessoa juridica e temos que herda de um classe mãe “pessoa” os atributos comuns entre as duas classes. Veja na imagem abaixo o cenário correspondente a classe Gente que é classe mãe e as classes GenteFisica e GenteJuridica.

image
Diagrama de Classe: Gente (SuperClasse) e GenteFisica e GenteJuridica (SubClasse).
 
image
Layout das Tabelas gente, gentefisica e gentejuridica.

Código de todas as classes relacionadas com o as classes acima mostradas.

Interface ICliente

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

namespace Dbanco.Classes.Interfaces
{
    public interface IGente
    {
        int Id { get; set; }
        string Nome { get; set; }
        System.Nullable<DateTime> DataNasc { get; set; }
    }
}

Classe Cliente

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Dbanco.Classes.Interfaces;
using FluentNHibernate.Mapping;

namespace Dbanco.Classes.Poco
{
    public class Gente: IGente
    {           
        public virtual int Id { get; set; }
        public virtual string Nome { get; set; }
        public virtual System.Nullable<DateTime> DataNasc { get; set; }
    }     
}

Classe ClienteMap (Classe de mapeamento com Fluent NHhibernate)

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

namespace Dbanco.Classes.Poco
{
    public class GenteMap: ClassMap<Gente>
    {
        public GenteMap()
        {
            Table("gente");
            Id(x => x.Id).Not.Nullable().UniqueKey("id")
                .GeneratedBy.Increment().Column("id");
            Map(x => x.Nome).Not.Nullable().Column("nome").Length(100);
            Map(x => x.DataNasc).Nullable().Column("datanasc");            
        }
    }
}

Nesse classe ClienteMap você usa o namespace FluentNhibernate.Mapping que tem os ítens necessários para você configurar sua classe com a tabela no banco. A primeira coisa a se fazer é herdar ClassMap e tipar ela com a classe corresponde que é no nosso caso a classe Gente. Construa um construtor sem paramentros e comece a configurar: Table que se refere a nome da tabela no seu banco, Id que se refere a primary Key da sua tabela com os atributos Not Nullable que significam não aceita valores nulos e UniqueKey que é o campo que é a chave primaria. Depois tem o Map que é responsável em mapear os outros campos e observe bem que tem sempre o Column que diz qual é o nome do campo na sua tabela que se refere ao que está na sua classe isso é muito importante para não acontecer erros de geração SQL inválidas. A seguir as outras classes que se segue com uma pequena diferença que será explicada logo abaixo.

Interface IGenteFisica

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

namespace Dbanco.Classes.Interfaces
{
    public interface IGenteFisica: IGente
    {
        string Cpf { get; set; }
    }
}

Interface IGenteJuridica

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

namespace Dbanco.Classes.Interfaces
{
    public interface IGenteJuridica: IGente
    {
        string Cnpj { get; set; }
        string IE { get; set; }
    }
}

Classe GenteFisica

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Dbanco.Classes.Interfaces;
using FluentNHibernate.Mapping;

namespace Dbanco.Classes.Poco
{    
    public class GenteJuridica: Gente, IGenteJuridica
    {
        public virtual string Cnpj { get; set; }
        public virtual string IE { get; set; }       
    }     
}

Classe GenteJuridica

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Dbanco.Classes.Interfaces;
using FluentNHibernate.Mapping;

namespace Dbanco.Classes.Poco
{    
    public class GenteJuridica: Gente, IGenteJuridica
    {
        public virtual string Cnpj { get; set; }
        public virtual string IE { get; set; }       
    }     
}

Classe GenteFisicaMap

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using FluentNHibernate.Mapping;
namespace Dbanco.Classes.Poco
{
    public class GenteFisicaMap:SubclassMap<GenteFisica>
    {
        public GenteFisicaMap()
        {
            Map(x => x.Cpf).Not.Nullable().Length(14);
            KeyColumn("genteid");
        }
    }
}

Classe GenteJuridicaMap

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using FluentNHibernate.Mapping;
namespace Dbanco.Classes.Poco
{
    public class GenteJuridicaMap: SubclassMap<GenteJuridica>
    {
        public GenteJuridicaMap()
        {
            Table("gentejuridica");
            Map(x => x.Cnpj).Column("cnpj").Not.Nullable().Length(18);
            Map(x => x.IE).Column("ie").Not.Nullable().Length(18);
            KeyColumn("genteid");            
        }
    }
}

O Mapemanto tanto da classe GenteFisicaMap e GenteJuridicaMap é um pouco diferente visto que são subclasses da superclasse Gente. As classes invês de herdarem da ClassMap vão herda outra que é bem sujestivo o nome SubclassMap e tipar com a referida classe. Construa o construtor normalmente e faça a mesma coisa que a GenteMap com os campos que possue, mas, não esquece de adicionar o KeyColumn que é responsável em dizer qual campo na tabela é 1 para 1 com a tabela gente.

Bom agora é só configurar a classe conexão (Exemplo Link: Classe FluentHibernate Conexao) e rodar a aplicação em um console ou aplicativo de sua preferencia para fazer os devidos testes.


Link Download Projeto Total: Download

MAPEAMENTO SIMPLES COM FLUENTNHIBERNATE COM VISUAL STUDIO 2010 C#


Referente a classe de conexão disponibilizado no blog (Link: Classe FluentHibernate Conexao), vamos criar um simples class Pessoa e demonstrar como seria o mapeamento dessa classe em relação sua tabela no banco de dados Mysql.

Foi criado um projeto Class Library e adicionado pelo Manage Nuget Packages (Gerenciador de Pacotes) o Fluent Nhibernate. Após isso foi criado um pasta com o nome de Classes de com sua estrutura mais três pastas: uma Interfaces (boa prática dando o layout padrão a classe), Poco que seriam as classes propriamente ditas com seus arquivos de mapeamento e Sessao aonde teria a pasta com a classe Conexao vindo do link logo acima.

Ficaria mais ou menos assim:

classes 

Analisando essa estrutura, a classe e a interface da Conexao.cs já estão no link que foi passado no primeiro paragrafo. A interface IPessoa possuem dois campos o Id e Nome e a classe Pessoa implementa essa interface ficando assim:

image

image

Bom até ai nada de novo mas, para esse ORM FluentNhibernate funcionar com o nosso banco será criado uma outra classe com a nomenclatura PessoaMap aonde ficarão todas as configurações que fazem relação entre a tabela “pessoa” do banco de dados com a classe “pessoa” do nosso projeto, ou seja, a ligação do modelo lógico (a classe) com o modelo fisico e vice-versa.

image

Essa classe de mapeamento possue um namespace FluentNhibernate.Mapping trazendo as configurações necessárias para concretizar esse mapeamento. Dentro do construtor dessa classe PessoaMap a primeira linha Table tem um configuração do tipo string que é o nome de sua tabela, o Id é correspondente ao campo Primary Key possuindo além disso mais configurações por exemplo Column responsável em dizer qual coluna essa se refere e no meu entender um configuração que não pode faltar nos campos e por fim o mapeamento do campo Nome (Map: server para mapear todos os campos restantes de sua tabela) seguindo a mesma lógica.

Para que seja testado e verificado se tudo está correto foi criado um novo projeto na mesma solução com o nome de DbBancoTestApplication aonde vamos abrir a sessão com o banco e gravar e essa classe no mesmo. Segue abaixo o Layout do Projeto:

image

image

No void desse Console Application (foi feito nele mas, pode ser utilizado em Web e Desktop), foi criado e aberto a classe Conexao, logo após criado e setado os dados na classe Pessoa e essa classe foi passado para a conexão para ser salva (como esse objeto não existe ele da o comando insert na sua tabela do banco de dados), observer que os comando Save da GetSession estão logo acima um BeginTransaction() e depois Transaction.Comit() são comando obrigatórios para que acontece o salvar dos dados na tabela. Observe o resultado:

image

image

Um boa prática quando não precisar mais da conexão executar o metodo Close e depois Dispose ou então só Dispose().

Outra boa pratica é que nesse projeto e demostrei em partes abrindo, operando e fechando a conexão, o ideal seria criar uma camada Dal com injeção de dependencia para otimizar essas rotinas.


Link para download: Baixar

CONSUMIR WEBSERVICE PHP COM VISUAL STUDIO 2010 C#


Vamos criar um WebService em PHP que será consumido com o Visual Studio com a linguagem C#. Para começar deve-se baixar o pacote nusoap (Link NuSoap), para que possamos utiliza-lo em nosso arquivo que tem a função de gerar o WSDL para que o Visual Studio consiga consumi-lo. A imagem logo abaixo é o exemplo que utilizaremos em nosso Web Service feito em PHP (Obs: deve ter um servidor rodando PHP) que possue duas funções: Uma que retornará um dados simples de soma de dois elementos e o outro um lista de unidade federativas de um banco de dados MySql. Na função de soma é bem simples se fazer, visto que no que retorna uma lista das unidade federativas deve se criar dois complexType, ou seja, tipos complexos para que seu funcionamento seja satisfatório em qualquer consumidor de Web Service e só lembrando que esse Web Service pode ser consumido em qualquer outra linguagem de sua preferência.soapphp

Link do arquivo PHP server4.php 

Agora vamos para o Visual Studio e Crie um projeto de sua preferência no meu caso vou criar um Console Application para fazer os testes. Quando criar o seu projeto vai em Add Services Reference com demostrado na imagem logo abaixo.

addservicereferencia

telaaddrefe

Observer que na caixa com o titulo Address você coloca o endereço do arquivo PHP e no final com paramentro wsdl para que seja gerado o arquivo Wsdl, sem ele o Visual Studio não consegue consumir o WebService. Clique no botão Go para que seja carregado na caixa Services o dados desse WebService e Renomei seu Namespace com o nome mais amigável, que no meu caso foi WsPhp e clique no botão Ok.

carreagdoweb

Abra seu código fonte agora do Visual Studio como imagem logo abaixo e vai vir uma classe que você possa manipular seu WebService criado no PHP.

consolewr

Dentro do NameSpace WsPhp tem a classe WSClientPortTypeClient que é responsável em ter os dois métodos criados no arquivo PHP que gera os dados do seu WebService e sua codificação é bem fácil e intuitiva.

O resultado obtido com foi: Na primeria linha a soma que retornou 500 e depois do espaço de linha a listagem de 9 Unidade Federativas que são obtidas em um banco de dados MySql

consoleresultado

Link do Console Application Visual Studio 2010 C#


Projeto Completo (Arquivo PHP e Console Application): Link Projetos

LER XML COM LINQ E XDOCUMENT


Existe formas de ler um arquivo do tipo Xml tanto da internet ou de um diretório local em sua aplicação.

Vamos agora mostrar 2 estruturas de Xml e como poderemos ler cada um mudando somente alguns comandos:

1) Estrutura: dados.xmlxml1

Segue agora como deve ser lido o dados.xml em um exemplo de Console Application Visual Studio 2010.xml1


2) Estrutura: dados1.xmlxml2

Segue agora como deve ser lido o dados1.xml em um exemplo de Console Application Visual Studio 2010.xml2codigo

A diferença entre as estruturas é que na dados.xml são divididas em elementos e na dados1.xml são representadas em atributos de cada elemento por isso a forma de leitura difere um da outra.

Pegue o Exemplo neste Link.

Conversões de Imagem para Array de Bytes


public static byte[] ConvertImageToByteArray(Image image, ImageFormat imageFormat) {
  if (image == null)
   return null;
  MemoryStream ms = new MemoryStream();
  image.Save(ms, imageFormat); return ms.ToArray();
}
 
public static Image ConvertByteArrayToImage(byte[] byteArray) {
if (byteArray == null || byteArray.Length == 0)
{ return (null); }
return (Image.FromStream(new MemoryStream(byteArray)));
}

Entity Framework–Herança (Gravar informações)


O seu layout de contexto deverá ficar assim:

image

Ou seja, existe uma herança entre as classes sendo sua base a de Cliente e suas filhas as Juridica e Fisica.

 

O seu layou de banco de dados criado no diagrama do SQL Server 2008 R2 Expression ficará assim:

image

Ou seja, um relacionamento de 1:1 entre as Cliente e Cliente_Juridica e também na Cliente_Fisica.

Para Adicionar valores então invés de você passar para cliente e depois para juridica o Entity Framework já faz isso transparente para você é só passar a classe Juridica como no exemplo logo abaixo que a mágica de grava automáticamente na classe Cliente (base):

image

O mesmo pode ser feito com Juridica da mesma maneira!

Para resgatar os valores utilize o link que está dentro do meu próprio site: Recuperação de Herança no Entity Framework.

O Entity Framework é simplesmente o melhor!!!

CRUD Básico para Entity Framework – EF4


Primeiramente será criado uma classe modelo, ou seja, uma Interface como a seguir:

public interface IModeloCrud<T>
{
        void Inserir(T objeto);
        void Alterar(T objeto);
        void Excluir(T objeto);
        void Excluir(Expression<Func<T, bool>> expressao);      
        T Get(Expression<Func<T, bool>> expressao);
        ICollection<T> GetLista();
        ICollection<T> GetLista(Expression<Func<T, bool>> expressao);
        void Salvar();
}

Essa Interface será o modelo da nossa classe Genérica de um Contexto do EF4 já existente. Então criaremos uma classe como o nome de Dal que será nosso CRUD da nossa aplicação.

public class Dal<T> : IDisposable, IModeloCrud<T> where T: class
{
        private BCONewEntities _contexto;
        public BCONewEntities Contexto
        {
            get { return _contexto; }
            set { _contexto = value; }
        }
       private ObjectSet<T> _obj;

        public ObjectSet<T> Objeto
        {
            get { return _obj; }
            set { _obj = value; }
        }
        public Dal()
        {
            _contexto = new BCONewEntities();
            _obj = _contexto.CreateObjectSet<T>();
           
        }
        public void Inserir(T objeto)
        {
            _obj.AddObject(objeto);
            _contexto.SaveChanges();
        }

        public void Alterar(T objeto)
        {
            _obj.Attach(objeto);
            _contexto.ObjectStateManager.ChangeObjectState(objeto, System.Data.EntityState.Modified);
            _contexto.SaveChanges();       
        }
        public void Excluir(T objeto)
        {
            _obj.Attach(objeto);
            _contexto.ObjectStateManager.ChangeObjectState(objeto, System.Data.EntityState.Deleted);
            _contexto.SaveChanges();
        }

        public void Excluir(Expression<Func<T, bool>> expressao)
        {
            T objexcluir = _obj.Where(expressao).FirstOrDefault();
            if (objexcluir != null)
            {
                _contexto.DeleteObject(objexcluir);
                _contexto.SaveChanges();
            }
        }     
        public T Get(Expression<Func<T, bool>> expressao)
        {
            return _obj.FirstOrDefault(expressao);
        }
        public System.Collections.Generic.ICollection<T> GetLista()
        {
            return _obj.ToList();
        }
        public System.Collections.Generic.ICollection<T> GetLista(Expression<Func<T, bool>> expressao)
        {
            return _obj.Where(expressao).ToList();
        }
        public void Salvar()
        {
            _contexto.SaveChanges();
        }
        public void Dispose()
        {
            _contexto.Dispose();
            GC.SuppressFinalize(this);
        }

}

 

Agora para você gravar um objeto por exemplo do tipo Pessoa seria esses passos:

Dal<Pessoa> dalpessoa = new Dal<Pessoa>();
Pessoa p = new Pessoa();
p.Nome = "Nome da Pessoa";          
dalpessoa.Inserir(p);

 

Agora para você alterar algum objeto pode ser de duas formas

1-Trazendo o objeto persistido da sua dalpessoa:

Pessoa p = dalpessoa.Get(c => c.Id == 10);
p.Nome = "Nome da Pessoa – alterado metodo 1";
dalpessoa.Salvar();

2-Passando o objeto inteiro e executando o método alterar

Dal<Pessoa> dalpessoa = new Dal<Pessoa>();
Pessoa p = new Pessoa();
p.Id = 10;
p.Nome = "Nome da Pessoa – alterado metodo 2";
dalpessoa.Alterar(p);

as outras formas são bem parecidas o excluir e o listar são bem intuitivos

O Entity Framework é uma grande framework de persistência e você pode utilizar para persistir qualquer dados em diversos SGBD de banco de dados. Aproveitem !!!