none
Modelo MVC RRS feed

  • Pergunta

  • Olá pessoal tudo beleza?
    Estou migrando do Delphi para C# .NET mas ainda estou aprendedo muitas coisas.
    Estou fazendo um pequeno sisteminha de cadastro e estou usando o padrão MVC, os Views e os Controls não tive problemas, mas os models, que são responsaveis pelo acesso ao banco de dados, isso esta me dando um pouco de dor de cabeça.
    Vamos ao problema:
    Nos Controls criei as seguintes classes: Pessoa, PessoaFisica e PessoaJuridica
    onde PessoaFisica e PessoaJuridica herdam Pessoa

    Nos View criei os seguintes Forms: frmPessoa, frmPessoaFisica, frmPessoaJuridica
    onde frmPessoaFisica e frmPesssoaJuridica herdam frmPessoa

    Já nos Models eu não imagino como fazer a classe PessoaDAO para que as outras classes herdem já que a classe PessoaFisica vai salvar seus dados em uma tabela diferente da classe PessoaJuridica, ou seria melhor no BD também montar essa hierarquia de classes tipo : tbPessoa, tbPessoaFisica e tbPessoaJuridica
    E na tbPessoa colocar todos o dados comum a pessoaFisica e pessoaJuridica e nas outras tabelas só colocar os dados especifico de cada uma fazendo um relacionamento entre as tabelas??

    desde já agradeço a ajuda de todos.
    quarta-feira, 1 de abril de 2009 17:59

Respostas

  • Falando... :)

    Fazer persistência no braço é algo trabalhoso. O custo no Mapeamento objeto-relacional 'era' cerca de 40% do custo de codificação.

    Digo "era" porque criaram-se os frameworks de persistência. (configuráveis)

    Sem eles, não terá jeito! Em algum momento você terá que violar o "encapsulamento". Mas...tirando essas filosofias...

    1- Aconselho (embora eu mesmo nao use) dar uma olhada no NHibernate! (ele facilita esse trabalho)

    2- Em relação às tabelas: 
        a) No SQLServer nao tem jeito, você irá ter que lidar com a herança também "no braço". Isto é. Existirão as três tabelas e você terá que colocar como fk da tabela pessoa fisica e pessoa juridica a pk da tabela pessoa. E depois, nas inserções de pessoa fisica e pessoa juridica, controlar através dessa chave (buscando na tabela pessoa)

        b) No Postgres existe maneiras de você declarar que uma tabela é filha de outra e um comando único para inserir na tabela filha (que já insere os dados referentes à tabela pai na pai e os dados da tabela filha na filha!) - é o que chamamos de bancos objeto-relacional. O Oracle também tem essa opção. O mysql e o sqlserver são exclusivamente Relacionais.

    3- Se quiser fazer no braço:
    A melhor maneira é declarar uma interface para o objeto Pessoa conversar com o objeto PessoaDAO (mas como esse não é o foco pelo que entendi de discussão...). Indo para como realizar a herança... No caso abaixo, parto da seguinte premissa: 
      
        - existe uma instância do objeto PessoaFisicaDAO, preenchido ou selecionado do banco.
     

    public class PessoaFisicaDAO: global::PessoaDAO
    {

    //Aqui é implementado o polimorfismo. Isto é, nao será chamado o método persistir da classe PessoaDAO, e sim o método da classe filha PessoaFisicaDAO
    //(por isso o 'override')

    public override void Persistir()     {

            //este "base" é para chamar a persistência da classe pai antes de começar a inserção dos dados da classe filha.
            // Dessa forma, você irá inserir primeiro os dados da pai 
           
            base.Persistir()
     
            //(omiti o tratamento de exceções, isto é, faça as verificações se houve inserção ou nao antes de continuar as inserções)
           
            //observe também que deverá haver um atributo private com a chave obtida na inserção do pai (para nao ficar passando parametros)
            //(esse tratamento dependerá de como está o seu projeto)

            ...
            inclua aqui sua rotina de inserção no BD

           ...       
    }
    }

    -------------------------

    Por fim. O método Persistir() na classe pai deverá ser declarado como virtual para permitir o polimorfismo

    -------------------------
    public class PessoaDAO:
    {

    public virtual void Persistir()     {

                    ----
                    inclua aqui sua rotina de inserção no BD

                    Não esqueça de atribuir a pk obtida no banco ao atributo private do comentário anterior.
                    ----
         }
    }

    No main... basta executar o PessoaFisicaDAO.Persistir().

    Ainda não é a melhor maneira de realizar. Aqui você apenas conseguirá realizar a inserção usando a herança. Você perceberá diversas outras dificuldades e o quanto é importante projetar todo esse mapeamento antes de ir para o código

    Espero ter ajudado
    Abs,
    Valdemar


    • Marcado como Resposta Cauê Nishijima quinta-feira, 2 de abril de 2009 17:40
    quinta-feira, 2 de abril de 2009 13:36

Todas as Respostas


  • Para lhe ajudar de um modo geral em MVC, você pode consultar os diversos links que estão na seguinte Thread do fórum:

    MVC - Exemplos
    http://social.msdn.microsoft.com/Forums/pt-BR/webgeralpt/thread/b5ae2db2-8ce9-44d5-9185-8ce543e4fb49


    Abraço,

    Magno Machado Borba |- Se o post foi util ou resposta nao esqueca de marcar.
    quarta-feira, 1 de abril de 2009 20:30
  • Fala Magno tudo certinho ctg?
    Dei uma lida em alguns links da Thread que você me mandou só que nenhum resolve meu problema, o meu problema não é com relação ao modelo MVC e sim em como projetar o banco de dados e fazer persistencia dos dados  de classes herdadas no modelo MVC, como expliquei no meu primeio post.
    Não sei se conseguir ser mto claro, se não consegui fala ai que tento explicar de outro modo...
    Abraço cara, valeu!
    quinta-feira, 2 de abril de 2009 11:50
  • Falando... :)

    Fazer persistência no braço é algo trabalhoso. O custo no Mapeamento objeto-relacional 'era' cerca de 40% do custo de codificação.

    Digo "era" porque criaram-se os frameworks de persistência. (configuráveis)

    Sem eles, não terá jeito! Em algum momento você terá que violar o "encapsulamento". Mas...tirando essas filosofias...

    1- Aconselho (embora eu mesmo nao use) dar uma olhada no NHibernate! (ele facilita esse trabalho)

    2- Em relação às tabelas: 
        a) No SQLServer nao tem jeito, você irá ter que lidar com a herança também "no braço". Isto é. Existirão as três tabelas e você terá que colocar como fk da tabela pessoa fisica e pessoa juridica a pk da tabela pessoa. E depois, nas inserções de pessoa fisica e pessoa juridica, controlar através dessa chave (buscando na tabela pessoa)

        b) No Postgres existe maneiras de você declarar que uma tabela é filha de outra e um comando único para inserir na tabela filha (que já insere os dados referentes à tabela pai na pai e os dados da tabela filha na filha!) - é o que chamamos de bancos objeto-relacional. O Oracle também tem essa opção. O mysql e o sqlserver são exclusivamente Relacionais.

    3- Se quiser fazer no braço:
    A melhor maneira é declarar uma interface para o objeto Pessoa conversar com o objeto PessoaDAO (mas como esse não é o foco pelo que entendi de discussão...). Indo para como realizar a herança... No caso abaixo, parto da seguinte premissa: 
      
        - existe uma instância do objeto PessoaFisicaDAO, preenchido ou selecionado do banco.
     

    public class PessoaFisicaDAO: global::PessoaDAO
    {

    //Aqui é implementado o polimorfismo. Isto é, nao será chamado o método persistir da classe PessoaDAO, e sim o método da classe filha PessoaFisicaDAO
    //(por isso o 'override')

    public override void Persistir()     {

            //este "base" é para chamar a persistência da classe pai antes de começar a inserção dos dados da classe filha.
            // Dessa forma, você irá inserir primeiro os dados da pai 
           
            base.Persistir()
     
            //(omiti o tratamento de exceções, isto é, faça as verificações se houve inserção ou nao antes de continuar as inserções)
           
            //observe também que deverá haver um atributo private com a chave obtida na inserção do pai (para nao ficar passando parametros)
            //(esse tratamento dependerá de como está o seu projeto)

            ...
            inclua aqui sua rotina de inserção no BD

           ...       
    }
    }

    -------------------------

    Por fim. O método Persistir() na classe pai deverá ser declarado como virtual para permitir o polimorfismo

    -------------------------
    public class PessoaDAO:
    {

    public virtual void Persistir()     {

                    ----
                    inclua aqui sua rotina de inserção no BD

                    Não esqueça de atribuir a pk obtida no banco ao atributo private do comentário anterior.
                    ----
         }
    }

    No main... basta executar o PessoaFisicaDAO.Persistir().

    Ainda não é a melhor maneira de realizar. Aqui você apenas conseguirá realizar a inserção usando a herança. Você perceberá diversas outras dificuldades e o quanto é importante projetar todo esse mapeamento antes de ir para o código

    Espero ter ajudado
    Abs,
    Valdemar


    • Marcado como Resposta Cauê Nishijima quinta-feira, 2 de abril de 2009 17:40
    quinta-feira, 2 de abril de 2009 13:36
  • E ae Valdemar beleza?
    Era isso mesmo que precisava, entao já ouvi falar do NHibernete do DLINQ to Entity que mapeam o banco de dados com o objeto.
    O NHibernete eu não tentei implementar ainda, e o DLINQ to Entity eu tive problemas pra utilizar, na minha máquina eu tenho a versão Express e a Professional do VS 2008, na Express a opção de criar o DLINQ to Entity apareceu legal, porem no Express o connector MySQL nao funcionou, já no Professional mesmo instalando o Framework 3.5 .NET a opção de criar DLINT to Entity não apareceu.
    Mas como estou começando em C# e no VS 2008, quero primeiro aprender a fazer no braço mesmo pra depois utilizar o NHibernete ou o DLINQ para fazer o mapeamento....

    Se alguem tiver algum tutorial de como usar o NHibernete ou como solucionar esse problema que estou tendo com o DLINQ me mande por favor....

    Abraço a todos....
    quinta-feira, 2 de abril de 2009 17:40
  • Cauê tive o mesmo problema que você com o SP1 do Framework 3.5, depois de tanto bater cabeça descobri que o correto é instalar o SP1 do VS 2008 que o problema se resolve.

    Veja o post:
    http://social.msdn.microsoft.com/Forums/pt-BR/504/thread/4610d733-fb2f-49f2-963e-fb6b5becf47f

    Quanto ao Linq to Entity ele é ótimo com MS SQL Server, mas com outros bancos você encontrará alguns contratempos visto que é desenvolvido por terceiros e a maioria pagos.

    Existe o  DBLinq to Entity que se comunica com vários bancos (MySQL, Oracle, Sql Lite etc) e é gratuito mas não posso afirmar que o mesmo é 100% perfeito visto que ainda não tive tempo de testa-lo e exauri-lo.

    Por enquanto para mim na área de Banco Objeto Relacional o melhor até o momento ainda é o Nhibernate, mas já me deparei com alguns problemas por conta de mapeamento de tabelas com chaves compostas. Dependendo da aplicação e do banco que for utilizado é melhor nem utilizar o Nhibernate por que ele pode afetar o desempenho. Já vivi isso na prática. Nada supera o bom e velho ADO.NET com Stored Procedures

    Aproveitando o ensejo tenho a seguinte curiosidade, o Nhibernate dá suporte para o Framework 3.0 e 3.5?
    Sei que dá para 1.1 e 2.0 mas nunca desenvolvi nada com ele em 3.5.








     
    Att,
    Leonardo C. Pereira
    Analista Desenvolvedor .Net

    (ps:) Por gentileza, favor classificar a mensagem quanto utilidade.
    terça-feira, 7 de abril de 2009 20:01
  • E ai Leonardo tranquilo?
    Fiz o exatamente o que estava no post, mas continua nao funcionando, teria como fazer um passo a passo?
    Eu utilizo o Visual Studio 2008 Professional.
    O que eu fiz, desinstalei tudo que tinha na minha maquina do VS, a versao professional e a express, desinstalei tb os frameworks .net que tinha. Ai tentei instalar o SP1, nao funcionou, ai instalei novamente o VS 2008 Professional e em seguida tentei instalar o SP1, e nada ainda....

    Abraço!!
    quinta-feira, 9 de abril de 2009 14:42
  • Cauê,

    Cara eu tinha instalado (ainda tenho) o VS 2005 na minha máquina quando instalei o VS 2008.
    Também tenho instaldo do SQL Server 2005 Express completo (Tools, reporting server etc).

    Segue os passo que fiz:

    Após a instalação do VS 2008 fiz todos os Windows Updates (inclusive o .NET Framework 3.5 SP1) e passei pelo problema que você esta passando de não conseguir ver alguns templates de projetos (Entity Framework como exemplo).

    Desistalei o .Net Framework 3.5 SP1.
    baixei e instalei o  programa que desinstala hotfix e updates do 2008. (o link ta no post:
    http://social.msdn.microsoft.com/Forums/pt-BR/504/thread/4610d733-fb2f-49f2-963e-fb6b5becf47)
    Após esses processos instalei o VS 2008 SP1 e pronto.

    Após estes passos deu certo.

    Se você optou por desinstalar tudo de sua máquina confira se o Framework SP1 também foi na leva das desisntalações.

    Então siga os passos:
    Instala VS 2008
    Instala o Prepared instalation 2008 tools
    e finalmente o VS 2008 SP1

    []'s


    Att,
    Leonardo C. Pereira
    Analista Desenvolvedor .Net

    (ps:) Por gentileza, favor classificar a mensagem quanto utilidade.
    quinta-feira, 9 de abril de 2009 19:41