none
Gravação de classe que contêm outra classe RRS feed

  • Pergunta

  • Tenho as seguintes classes:

        public class Marca
        {
            public int Id { get; set; }
            public string Nome { get; set; }
        }
        
        public class Produto
        {
            public int Id { get; set; }
            public string Nome { get; set; }
            public int Quantidade { get; set; }
    
            public Marca Marca { get; set; }
        }
    

    Sendo a marca um dropdown na tela de cadastro de produto, qual a melhor maneira de realizar a gravação?

    Deixo a propriedade 'Marca' sendo do tipo 'Marca' ou crio uma propriedade do tipo int chamada 'MarcaId'?

    Se eu deixar como está preciso fazer um find toda vez para preencher a propriedade Marca quando for salvar?


    http://www.linkedin.com/pub/murilo-kunze/44/191/455

    terça-feira, 10 de abril de 2012 13:45

Respostas

  • Murilo, o corretor seria deixara referência, você está programando em OO então tem de usar as lógicas e ferramentas OO. usar o identificador é um paradigma relacional de banco de dados. Só quem deve saber como tratar isto é o sua camada de persistência.

    Olavo Oliveira Neto
    http://olavooneto.wordpress.com
    Twitter @Olavooneto
    Facebook Olavo Neto
    Linkedin Olavo Neto
    Se for útil marque como resposta e faça um Developer feliz :)

    terça-feira, 10 de abril de 2012 13:50
  • Olá Murilo,

    Entendo esse problema...

    Vc quer apenas atualizar sem ter que voltar na base de dados.

    Realmente não existem muitas saídas, mas podemos fazer um teste :)

    Tenta fazer assim:

                if (ModelState.IsValid) 
                {
                    produto.Marca = new Marca();
                    produto.Marca.Id = 10; //No caso o valor do inteiro do drop...
                    db.Entry(produto.Marca).State = EntityState.Unchanged;
                    db.Produtoes.Add(produto);
                    db.SaveChanges();
                    return RedirectToAction("Index");  
                }
    
                return View(produto);

    Vamos ver se assim funciona :)

    []s!


    Fernando Henrique Inocêncio Borba Ferreira
    while(alive){ this.WriteCode(); }
    Blog: http://ferhenriquef.com/
    Twitter: @ferhenrique

    • Marcado como Resposta Murilo Kunze terça-feira, 10 de abril de 2012 14:23
    terça-feira, 10 de abril de 2012 14:16
    Moderador
  • Fernando, se eu fizer um 'new Marca()', vou perder o id que contêm em produto.Marca, então fiz o seguinte:

            public ActionResult Create(Produto produto)
            {
                if (ModelState.IsValid)  
                {
                    db.Entry(produto.Marca).State = EntityState.Unchanged;
    
                    db.Produtoes.Add(produto);
                    db.SaveChanges();
                    return RedirectToAction("Index");  
                }
    
                return View(produto);
            }

    funcionou perfeitamente!

    Muito obrigado.


    http://www.linkedin.com/pub/murilo-kunze/44/191/455

    terça-feira, 10 de abril de 2012 14:23

Todas as Respostas

  • Murilo, o corretor seria deixara referência, você está programando em OO então tem de usar as lógicas e ferramentas OO. usar o identificador é um paradigma relacional de banco de dados. Só quem deve saber como tratar isto é o sua camada de persistência.

    Olavo Oliveira Neto
    http://olavooneto.wordpress.com
    Twitter @Olavooneto
    Facebook Olavo Neto
    Linkedin Olavo Neto
    Se for útil marque como resposta e faça um Developer feliz :)

    terça-feira, 10 de abril de 2012 13:50
  • Olá Murilo,

    Sou 100% a favor das palavras do Olavo.

    Qual tecnologia de acesso a dados vc esta utilizando para persistir as informações na base de dados?

    []s!

    Fernando Henrique Inocêncio Borba Ferreira
    while(alive){ this.WriteCode(); }
    Blog: http://ferhenriquef.com/
    Twitter: @ferhenrique

    terça-feira, 10 de abril de 2012 13:55
    Moderador
  • Estou usando o entity.. pois é, tb penso assim.. mas bateu uma duvida porque é muito chato ficar usando .Find para encontrar os objetos.

    http://www.linkedin.com/pub/murilo-kunze/44/191/455

    terça-feira, 10 de abril de 2012 14:00
  • Olá Murilo,

    Não necessariamente vc precisa utilizar o Find.

    Poderia citar um exemplo da situação que vc não quer que ocorra. Depdendo do que for podemos fazer alguma configuração para trazer o objeto já carregado.Como por exemplo utilizar Includes ( http://ferhenriquef.com/2012/03/19/uso-de-include-em-consultas-com-o-entity-framework-code-first/ )

    []s!


    Fernando Henrique Inocêncio Borba Ferreira
    while(alive){ this.WriteCode(); }
    Blog: http://ferhenriquef.com/
    Twitter: @ferhenrique

    terça-feira, 10 de abril de 2012 14:03
    Moderador
  • Fernando, o problema é só na hora de gravar pois recebo da view somente o id da marca(marcas estão em um dropdown).

    Quando faço isso:

            public ActionResult Create(Produto produto)
            {
                if (ModelState.IsValid) 
                {
                    db.Produtoes.Add(produto);
                    db.SaveChanges();
                    return RedirectToAction("Index");  
                }
    
                return View(produto);
            }

    a propriedade 'Marca' vem com o id=1 (id do item selecionado no drop) mas as outras propriedades vem 'null', então quando é feito o SaveChanges é criado uma outra marca no banco com todas as propriedades null.. agora se eu fizer o seguinte:

            public ActionResult Create(Produto produto)
            {
                if (ModelState.IsValid) 
                {
                    produto.Marca = db.Marcas.Single(p => p.Id == produto.Marca.Id); <<<<<
                    db.Produtoes.Add(produto);
                    db.SaveChanges();
                    return RedirectToAction("Index");  
                }
    
                return View(produto);
            }
    ai funciona.


    http://www.linkedin.com/pub/murilo-kunze/44/191/455


    • Editado Murilo Kunze terça-feira, 10 de abril de 2012 14:10 faltando palavras
    terça-feira, 10 de abril de 2012 14:09
  • Olá Murilo,

    Entendo esse problema...

    Vc quer apenas atualizar sem ter que voltar na base de dados.

    Realmente não existem muitas saídas, mas podemos fazer um teste :)

    Tenta fazer assim:

                if (ModelState.IsValid) 
                {
                    produto.Marca = new Marca();
                    produto.Marca.Id = 10; //No caso o valor do inteiro do drop...
                    db.Entry(produto.Marca).State = EntityState.Unchanged;
                    db.Produtoes.Add(produto);
                    db.SaveChanges();
                    return RedirectToAction("Index");  
                }
    
                return View(produto);

    Vamos ver se assim funciona :)

    []s!


    Fernando Henrique Inocêncio Borba Ferreira
    while(alive){ this.WriteCode(); }
    Blog: http://ferhenriquef.com/
    Twitter: @ferhenrique

    • Marcado como Resposta Murilo Kunze terça-feira, 10 de abril de 2012 14:23
    terça-feira, 10 de abril de 2012 14:16
    Moderador
  • Fernando, se eu fizer um 'new Marca()', vou perder o id que contêm em produto.Marca, então fiz o seguinte:

            public ActionResult Create(Produto produto)
            {
                if (ModelState.IsValid)  
                {
                    db.Entry(produto.Marca).State = EntityState.Unchanged;
    
                    db.Produtoes.Add(produto);
                    db.SaveChanges();
                    return RedirectToAction("Index");  
                }
    
                return View(produto);
            }

    funcionou perfeitamente!

    Muito obrigado.


    http://www.linkedin.com/pub/murilo-kunze/44/191/455

    terça-feira, 10 de abril de 2012 14:23
  • Ahhhhhh muleque! Mais uma base de dados rolando com o EF!!!!!!!! :D

    []s!


    Fernando Henrique Inocêncio Borba Ferreira
    while(alive){ this.WriteCode(); }
    Blog: http://ferhenriquef.com/
    Twitter: @ferhenrique

    terça-feira, 10 de abril de 2012 14:24
    Moderador