sexta-feira, 13 de março de 2015

Relacionamento 1:1 no Nhibernate

Ah, a alegria de fazer o relacionamento 1:1 funcionar no NHibernate! Faz anos que tento!

A solução descrita aqui é para FluentNHibernate e usando IAutoMappingOverride.

No map da classe que corresponde a entidade que tem o ID apontando para a outra, não precisa fazer nada. Já no outro map, é necessário colocar este código:
-
mapping.HasOne(m => m.[outra classe]).PropertyRef(b => b.[classe dona do map]);
-
-
Como a gente entende mais vendo código que falando, aqui vai o exemplo:
-
SQL
create table Mother
(
    ID int
)
-
create table Daughter
(
    ID int,
    Mother_ID int
)
-
-
Entidades
class Mother
{
    int ID { get; set; }
    Daughter Daughter { get; set; }
}
-
class Daughter
{
    int ID { get; set; }
    Mother Mother { get; set; }
}
-
-
Mappings
public class MotherMap : IAutoMappingOverride<Mother>
{
    public void Override(AutoMapping<Mother> mapping)
    {
        mapping.HasOne(m => m.Daughter).PropertyRef(b => b.Mother);
    }
}

-
public class DaughterMap : IAutoMappingOverride<Daughter>
{
    public void Override(AutoMapping<Daughter> mapping)
    {
    }
}

-