Inquiridor
Inserir vários itens no banco com Fluent NHibernate?

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?
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.
William John Adam Trindade
Analyste-programmeur
----------------------------------------------------------
-
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); } } } }