none
Model com Relação 1 para 1 (Update, Create) Dúvida sobre comportamento RRS feed

  • Pergunta

  • Olá estou com uma dúvida em relação a seguinte situação;

    Tenho uma Classe neste sentido:

        public partial class Cadastro
        {
            public int cd_cadastro  { get; set; }
            public string razao { get; set; }
            public string fantasia { get; set; }
            .....
        }

    e outra classe assim:

        public partial class Cliente
        {
            public int cd_cadastro  { get; set; }
            public bool protesto { get; set; }
            public int tabela_padrao { get; set; }
            .....
        }
    

    *as classes aqui estão de exemplo

    As duas classes representa as tabelas do meu banco de dados, e tem relação de 1-1.

    Acontece o seguinte, o usuário insere um registro, este vai para a tabela "Cadastro", quando este registro também é "Cliente" o usuário define alguns dados que são somente a clientes e com isso populo a tabela "Cliente" com estes dados.

    Fizemos neste modelo pois quando o Registro é um Fornecedor por exemplo não precisaria informar a "tabela_padrao" pois este campo pertence a "Cliente" e não a "Fornecedor"

    Até ok..

    Tenho o Controller e a View de Cadastro, mas gostaríamos que houvesse uma maneira de ter apenas 1 View para cada situação, ou seja, A View Create vai criar Cadastro e Cliente (Se o usuário informar na View que é Cliente)

    A View Update vai alterar Cadastro e Cliente (Se o usuário alterar dados em cliente)

    Mas não tenho idéia de como fazer isso.

    Eu Tentei fazer assim:

    public partial class CadastroCliente
        {
            public Cadastro Cadastro { get; set; }
            public Cliente  Cliente { get; set; }
        }

    mas acho que não estou no caminho certo.

    Alguém tem algum luz ou um caminho para que eu possa seguir ?

    Obrigado



    Isco Sistemas José Luiz Borges

    quinta-feira, 3 de abril de 2014 13:43

Todas as Respostas

  • Olá José Luiz,

    Creio que não seja um bom caminho criar uma unica View que possa ser compartilhado por duas Model distinta, ou criar uma ViewModel que encapsula estas duas Model, digo isso pois a curta prazo possa até te atender, porem a longo prazo se houver uma característica no cadastro de cliente que seja diferente o cadastro de "cadastro" você vai ter que fazer diversos "if" nesta sua View para não impactar o cadastro/alteração de Cliente.

    Oque você acha José?

    Vitor Mendes | http://www.vitormendes.com.br/

    "Ajuda teu semelhante a levantar a sua carga, porém, não a carregá-la." (Pitágoras)

    quinta-feira, 3 de abril de 2014 14:07
  • Entendo..

    Mas qual seria a melhor forma na sua opinião ?

    Replicar as colunas da tabela cliente na tabela cadastro ? para manter um model somente ?

    Ou na Lista de Cadastro (Index) Colocar um LINK para o cara preencher os dados de clientes ?


    Isco Sistemas José Luiz Borges

    quinta-feira, 3 de abril de 2014 14:36
  • José,

    Duplicar as colunas sim, usar da mesma Model não, olhando a sua duvida eu consegui entender que você possui um cadastro de Cliente e outro de Fornecedor, em ambos as tabelas você quer fazer colunas com fins de auditoria certamente (data criação, data alteração, quem alterou pela ultima vez e etc) e neste caso é comum cada tabela ter estas informações junta dela e não uma tabela que sera responsável por controlar todas as alterações.

    Vitor Mendes | http://www.vitormendes.com.br/

    "Ajuda teu semelhante a levantar a sua carga, porém, não a carregá-la." (Pitágoras)

    quinta-feira, 3 de abril de 2014 14:44
  • Na verdade é assim:

    Um Cadastro pode ser estendido para Cliente, Fornecedor...

    Isso por que dados comuns entre Clientes e Fornecedores, como CEP, Endereco estão na tabela Cadastro, mas dados como "Preço de Venda" estão somente na Cliente, veja a imagem abaixo:

    Então as Tabelas de Cliente e Fornecedores não são para auditoria, são tabelas que contém dados mas que são voltados para Clientes ou Fornecedores....

    A Grande Dúvida é:

    Como ter uma View onde o usuário ao inserir um Cadastro, informar que ele também é cliente e neste caso postar alguns dados referentes a clientes....


    Isco Sistemas José Luiz Borges

    quinta-feira, 3 de abril de 2014 16:59
  • José,

    Bom pelo oque você disse isso já é um cadastro legado, pois existe informações que cadastro do tipo pessoa Física não compartilha com pessoal Juridica, porem oque pode ser feito é justamente duas telas, uma de cadastro de Cliente e outra de Fornecedor, ao final do formulário teria um botão para cadastrar/consultar um Cadastro, para posteriormente utiliza-lo, esta tela de consultar e utilização de Cadastro seria compartilhada entre as duas View poderia até ser uma PartialView, sendo chamada para um Modal via Ajax.

    Vitor Mendes | http://www.vitormendes.com.br/

    "Ajuda teu semelhante a levantar a sua carga, porém, não a carregá-la." (Pitágoras)

    quinta-feira, 3 de abril de 2014 18:38
  • Opa...

    Desculpe não compreendi muito bem seu último post.

    "porem oque pode ser feito é justamente duas telas, uma de cadastro de Cliente e outra de Fornecedor, "

    É Justamente o que não queremos.

    Queríamos que o no próprio "Cadastro Geral" (Na View Create ou Edit) o usuário possa marcar que o cadastro é Cliente , preencher os dados de Cliente e eu salvar dentro do Banco

    Hoje eu Faco assim

    Action Result Post(Cadastro cadastrogeral, int? Tabela_Vendas, string protestar)

    Ai eu pego os valores que vem em Tabela_Vendas (input name="Tabela_Vendas") e faco os inserts em Cliente

    O problema é a programação fica "suja" sei la.... e é extremamente Ruim manter o codigo como está....

    Outra idéia que fizemos foi: Quando o usuário faz o POST de Cadastro eu redireciono para o Edit do Cadastro e lá tem os botões Cliente, Fornecedores... que chamam outra tela..

    Mas assim tb é ruim

    a idéia era assim

    Action Result Post(Cadastro cadastrogeral, Cliente cli, Fornecedor for)

    Mas para isso eu acho que deveria ter algum Model neste sentido

    Class Pessoas

    {

       public Cadastro Cadastro {get; set}

       public Cliente Cliente {get;set}

    }

    como se fosse uma ViewModel


    Isco Sistemas José Luiz Borges

    quinta-feira, 3 de abril de 2014 19:11
  • Dá aplicar alguma coisa do tipo

    http://eduardopires.net.br/2013/08/asp-net-mvc-view-model-pattern-quando-e-como-utilizar/


    Isco Sistemas José Luiz Borges

    sexta-feira, 4 de abril de 2014 11:38
  • Você tem um relacionamento 1 para 1 aonde Cadastro (será sua super classe) e Cliente e Fornecedor serão as classes filhas (HERANÇA) ...

    1 - Você ta usando Entity Framework ou está fazendo ADO.NET ?

    2 - Deseja utilizar uma View para os dois Cliente e Fornecedores ?

    ????


    Fulvio Cezar Canducci Dias

    sexta-feira, 4 de abril de 2014 13:42
  • Opa obrigado por responder

    1 - Você ta usando Entity Framework ou está fazendo ADO.NET ?

    Entity Framework

    2 - Deseja utilizar uma View para os dois Cliente e Fornecedores ?

    Clientes e Fornecedores são tabelas filhas da Tabela Cadastro. 

    Quando o usuário vai cadastrar um novo Cadastro ele preenche as informações que são comuns a Clientes e Fornecedore, como CEP, Endereco e tal...

    O Que pretendíamos era que na View Create do Cadastro, o usuário poderia dizer que o Cadastro tb é cliente e fazer um insert na tabela de cliente

    Segue o Print da Tela de Create de Cadastro, derrepente fica mais fácil de eu explicar...

    A questão é como tratar isso de uma maneira "inteligente", pois hoje que passo assim

    public ActionResult Create(Cadastro cadastro, string cd_tabela_cli, string protesto)
    {
      if cd_tabela_cli != null
        insere em cliente
    
    }

    mas esta muito ruim e deve ter um jeito de melhorar (Pois tem Edit, Create...)

    Então pensei que algo como uma VIEWMODEL, mas não sei se aplica...

    por isso pensei que possa existir algo assim:

    public partial class CadastroCliente
    {
       Public Cadastro Cadastro {get;set;}
       Public Cliente  Cliente  {get;set;}
    
    }
    
    //
    [HttpPost]
    public ActionResult Create(Cadastro cadastro, Cliente cliente)
    {
      // insere casdastro
      // insere cliente (se houver registro)
    
    }
    
    
    
    

    A Relação Entre Cadastro e Cliente é 1 para 1 sendo que o cadastro é o PAI

    na minha entities estou fazendo assim:

       /* foreign keys */
                modelBuilder.Entity<Cadastro>().HasRequired(a => a.Cliente).WithOptional().WillCascadeOnDelete(true);
                modelBuilder.Entity<Cadastro>().HasRequired(a => a.Fornecedor).WithOptional().WillCascadeOnDelete(true);
                modelBuilder.Entity<Cadastro>().HasRequired(a => a.Comissionado).WithOptional().WillCascadeOnDelete(true);


    Isco Sistemas José Luiz Borges

    sexta-feira, 4 de abril de 2014 14:21
  • Boa tarde

    Acho que Já consegui o que queria

        public partial class CadCli { 
            public virtual Cadastro Cadastro {get;set;}
            public virtual Cliente Cliente {get;set;}
        }

      var model = new CadCli
                {
                    Cadastro = db.Cadastro.Find(id)
                    ,
                    Cliente = db.Cliente.Find(id)
    
                };

    [HttpPost] public ActionResult Edit(Cadastro cadastro, Cliente cliente) { // metodo para salvar o Cadastro

    // metodo para salvar o clietne }


    Isso mesmo.. deu certinho aqui

    obrigado a todos 


    Isco Sistemas José Luiz Borges

    sexta-feira, 4 de abril de 2014 15:14