Update com Nhibernate

14 views
Skip to first unread message

Luis Fernando Costa

unread,
Jul 19, 2013, 1:19:01 PM7/19/13
to de...@googlegroups.com
Estou usando NHibernate como camada de persistência e mapeamento feito com Fluent NHibernate.

public class Pessoa
    {
        public virtual int Codigo { get; set; }
        public virtual string Nome { get; set; }
        public virtual string Endereco { get; set; }
        public virtual string Cep { get; set; }
        public virtual string Email { get; set; }
        public virtual DateTime DataCadastro { get; set; }
        
        public virtual Status Status { get; set; }
        public virtual Departamento Departamento { get; set; }
        public virtual IList<Grupo> Grupos { get; set; }
        public virtual IList<Telefone> Telefones { get; set; }

        public Pessoa()
        {
            this.Grupos = new List<Grupo>();
            this.Telefones = new List<Telefone>();
        }
    }

public class Telefone
    {
        public virtual int Codigo { get; set; }
        public virtual int CodigoDdd { get; set; }
        public virtual int Numero { get; set; }
        public virtual Pessoa Pessoa { get; set; }
    }
public PessoaMap()
    {
        Id(x => x.Codigo)
            .GeneratedBy.Identity();

        Map(x => x.Nome)
            .Not.Nullable()
            .Length(255);

        Map(x => x.Endereco)
            .Length(255);

        Map(x => x.Cep)
            .Length(255);

        Map(x => x.Email)
            .Length(255);

        Map(x => x.DataCadastro)
            .Not.Nullable();

        Map(x => x.Status)
            .CustomType<GenericEnumMapper<Status>>();

        References(x => x.Departamento)
            .Not.Nullable();

        // Mapeamento NxN.
        HasManyToMany(x => x.Grupos);

        HasMany(x => x.Telefones).Cascade.All();
    }

public TelefoneMap()
    {
        Id(x => x.Codigo).GeneratedBy.Identity();

        Map(x => x.CodigoDdd)
            .Not.Nullable()
            .Length(255);

        Map(x => x.Numero)
            .Not.Nullable();

        References(x => x.Pessoa);
    }

Ao incluir um registro tudo certo, inclui a pessoa e seus telefones.

public void Cadastrar_Pessoa_Fisica_Com_Telefone()
        {
            var sessionFactory = Conexao.CreateSessionFactory();

            using (var session = sessionFactory.OpenSession())
            {
                using (var transaction = session.BeginTransaction())
                {
                    PessoaFisica _obj = new PessoaFisica();
                    _obj.Nome = "Nome da pessoa fisica com telefone";
                    _obj.Endereco = "Endereço da pessoa fisica com telefone";
                    _obj.Cep = "12345678";
                    _obj.Email = "pes...@gmail.com";
                    _obj.DataCadastro = DateTime.Now;
                    _obj.Cpf = "12345678900";
                    _obj.Nacionalidade = "Brasil";

                    _obj.Departamento = session.Get<Departamento>(1);

                    _obj.Status = Status.Inativo;

                    _obj.Telefones.Add(new Telefone()
                    {
                        CodigoDdd = 43,
                        Numero = 123456
                    });

                    _obj.Telefones.Add(new Telefone()
                    {
                        CodigoDdd = 56,
                        Numero = 5656
                    });

                    session.SaveOrUpdate(_obj);
                    transaction.Commit();
                }
            }
        }

Ao alterar o mesmo registro com o seguinte metodo.

public void Cadastrar_Pessoa_Fisica_Com_Telefone()
        {
            var sessionFactory = Conexao.CreateSessionFactory();

            using (var session = sessionFactory.OpenSession())
            {
                using (var transaction = session.BeginTransaction())
                {
                    PessoaFisica _obj = new PessoaFisica();
                     _obj.Codigo = 1;
                    _obj.Nome = "Nome da pessoa fisica com telefone";
                    _obj.Endereco = "Endereço da pessoa fisica com telefone";
                    _obj.Cep = "12345678";
                    _obj.Email = "pes...@gmail.com";
                    _obj.DataCadastro = DateTime.Now;
                    _obj.Cpf = "12345678900";
                    _obj.Nacionalidade = "Brasil";

                    _obj.Departamento = session.Get<Departamento>(1);

                    _obj.Status = Status.Inativo;

                    _obj.Telefones.Add(new Telefone()
                    {
                        Codigo=2,
                        CodigoDdd = 56,
                        Numero = 4141
                    });

                    session.SaveOrUpdate(_obj);
                    transaction.Commit();
                }
            }
        }

O telefone Codigo=1,CodigoDdd = 43,Numero = 123456 como foi removido da lista deveria ser removido da base de dados, porem esta atribuindo null para a coluna pessoa_id na tabela de telefone.

Cassio Pinheiro Almeron

unread,
Jul 19, 2013, 1:22:50 PM7/19/13
to de...@googlegroups.com
Tente mapear assim:

HasMany(x => x.Telefones).Cascade.AllDeleteOrphans();

Fábio Finn

unread,
Jul 19, 2013, 1:23:37 PM7/19/13
to de...@googlegroups.com

Depois do session.SaveOrUpdate(), dá um session.Flush().
No update tem uma questão de cache, eu acho, e as vezes acontece isso, não lembro muito bem agora.

Att,
Fábio

--
--
--
Acesse nosso blog http://devrs.net/
Siga-nos no twitter! http://twitter.com/DevRsNet
--
Antes de criar um novo post, para maior organização do grupo, procure seguir as regras de TAGS: http://devrs.net/regras-da-lista
Para postar para o grupo, envie email para de...@googlegroups.com
Para sair do grupo, envie email para devrs+un...@googlegroups.com
 
---
Você está recebendo esta mensagem porque se inscreveu no grupo "DevRS.NET" dos Grupos do Google.
Para cancelar a inscrição neste grupo e parar de receber seus e-mails, envie um e-mail para devrs+un...@googlegroups.com.
Para obter mais opções, acesse https://groups.google.com/groups/opt_out.
 
 

Luis Fernando Costa

unread,
Jul 19, 2013, 2:08:33 PM7/19/13
to de...@googlegroups.com
Nenhuma das tentativas funcionaram.

Cassio Pinheiro Almeron

unread,
Jul 19, 2013, 2:34:15 PM7/19/13
to de...@googlegroups.com
Coloque também o Inverse:

HasMany(x => x.Telefones).Inverse().Cascade.AllDeleteOrphans();

Luis Fernando Costa

unread,
Jul 19, 2013, 3:17:26 PM7/19/13
to de...@googlegroups.com

Com o Inverse() o nhibernate seta null para os registros que estavam na lista.


Em sexta-feira, 19 de julho de 2013 14h19min01s UTC-3, Luis Fernando Costa escreveu:
Reply all
Reply to author
Forward
0 new messages