none
Inserir vários itens no banco com Fluent NHibernate? RRS feed

  • Pergunta

  • Tem um form com alguns textboxes e um listview. Como faço para inserir os itens do listview no banco?

    Abaixo o código que estou usando:

        public class Itens_Manutencao
        {        
            public virtual Manutencao manutencao { get; set; }
            public virtual int id_manutencao { get; set; }
            public virtual int id_item { get; set; }
            public virtual string descricao { get; set; }
            public virtual double quantidade { get; set; }
            public virtual string tipo_servico { get; set; }           
        }
    
        public class Itens_ManutencaoMap : ClassMap<Itens_Manutencao>
        {
            public Itens_ManutencaoMap()
            {
                Table("itens_manutencao");
                LazyLoad();            
                Id(x => x.id_manutencao);
                References(x => x.manutencao).Column("id_manutencao");
                Map(x => x.id_item).Column("id_item");
                Map(x => x.descricao).Column("descricao");            
                Map(x => x.quantidade).Column("quantidade");
                Map(x => x.tipo_servico).Column("tipo_servico");            
            }
        }
    
       public class Manutencao
        {
            public Manutencao()
            {
                itens_manutencao = new List<Itens_Manutencao>();
            }
            public virtual int id { get; set; }      
            public virtual int codigo_local_execucao { get; set; }
            public virtual string local_execucao { get; set; }
            public virtual string frota { get; set; }
            public virtual string marca_modelo { get; set; }
            public virtual string placa { get; set; }
            public virtual int km_hr_atual { get; set; }
            public virtual IList<Itens_Manutencao> itens_manutencao { get; set; }
        }
    }
    
        public class ManutencaoMap : ClassMap<Manutencao>
        {
            public ManutencaoMap()
            {
                Table("manutencao");
                LazyLoad();
                Id(x => x.id).GeneratedBy.Identity().Column("id");            
                Map(x => x.data_manutencao).Column("data_manutencao");
                Map(x => x.codigo_local_execucao).Column("codigo_local_execucao").Not.Nullable();
                Map(x => x.local_execucao).Column("local_execucao");
                Map(x => x.frota).Column("frota");
                Map(x => x.marca_modelo).Column("marca_modelo");
                Map(x => x.placa).Column("placa");
                Map(x => x.km_hr_atual).Column("km_hr_atual");
                HasMany(x => x.itens_manutencao).Cascade.All();
            }
        }
    
    //form
    
    manutencao = new Manutencao();
    manutencaoRep = new ManutencaoRep();
    
    var m = manutencao;
    
    m.data_manutencao = dtpDataManutencao.Value;
    m.codigo_local_execucao = int.Parse(txtCodigoLocalExecucao.Text);
    m.local_execucao = txtLocalExecucao.Text;
    m.frota = txtFrota.Text;
    m.marca_modelo = txtMarcaModelo.Text;
    m.placa = txtPlaca.Text;
    m.km_hr_atual = int.Parse(txtKmHoraAtual.Text);
    
    Itens_Manutencao itens_manutencao = new Itens_Manutencao();
    
    var i = itens_manutencao;
    
    foreach (ListViewItem item in lsvItensManutencao.Items)
    {
    	i.tipo_servico = item.Text;
    	i.id_item = int.Parse(item.SubItems[1].Text);
    	i.descricao = item.SubItems[2].Text;
    	i.quantidade = double.Parse(item.SubItems[3].Text);
    	i.manutencao = m;// m.id;
    	m.itens_manutencao.Add(i);
    }
    manutencaoRep.Inserir(m);
    

    Os dados referentes a tabela manutencao são inseridos normalmente no banco.

    O erro está quando insiro os dados na tabela itens_manutencao, os dados referentes a esta tabela vem da listview, acontece que ao invés de inserir duas ou mais linhas da lista, é inserido apenas a última linha (supondo que tenha no minimo duas linhas com dados). Como posso fazer um insert na tabela com vários registros?  

     
    sábado, 30 de julho de 2016 16:52

Todas as Respostas

  • Voce poderia nos mostrar o metodo Inserir?

    Mas caso seja varias linhas eu sugiro o uso de tecnicas de insersao em Batch:

    http://nhibernate.info/doc/nhibernate-reference/batch.html

    A ideia é simples, é usa uma transaçao e  só fazer o commit no fim do processo. Isso acelera bastante o processo.

    Att


    William John Adam Trindade
    Analyste-programmeur
    ----------------------------------------------------------

    terça-feira, 9 de agosto de 2016 14:47
    Moderador
  •         public void Inserir(T entidade)
            {
                using (ISession session = SessionFactory.AbrirSession())
                {
                    using (ITransaction transacao = session.BeginTransaction())
                    {
                        try
                        {
                            session.Save(entidade);
                            transacao.Commit();
                        }
                        catch (Exception ex)
                        {
                            if (!transacao.WasCommitted)
                            {
                                transacao.Rollback();
                            }
                            throw new Exception("Erro ao inserir entidade: " + ex.Message);
                        }
                    }
                }
            }

    sábado, 13 de agosto de 2016 12:56