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.DataCadastro = DateTime.Now;
_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.DataCadastro = DateTime.Now;
_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.