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.
| Diagrama de Classe: Gente (SuperClasse) e GenteFisica e GenteJuridica (SubClasse). |
| 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
