Existem duas maneiras de fazer um mapeamento bidirecional um-para-um com NHibernate, através de associação por Primary Key e Foreign Key, vamos pegar como exemplo as classes a seguir:

[csharp]

public class Setting
{
public virtual Guid Id { get; set; }
public virtual Student Student { get; set; }
}

public class Student
{
public virtual Guid Id { get; set; }
public virtual Setting Setting { get; set; }
}

[/csharp]

Primary Key Association

[csharp]

public SettingMap()
{
Id(x => x.Id).GeneratedBy.Guid();
HasOne(x => x.Student).Cascade.All();
}

public StudentMap()
{
Id(x => x.Id).GeneratedBy.Foreign("Setting");
HasOne(x => x.Setting).Constrained();
}

[/csharp]

… salvando uma nova instância da classe Setting:

[csharp]

var setting = new Setting();

setting.Student = new Student();
setting.Student.Name = "student1";
setting.Student.Setting = setting;
setting.Name = "setting1";
session.Save(setting);

[/csharp]

Foreign Key Association

[csharp]

public SettingMap()
{
Id(x => x.Id).GeneratedBy.Guid();
References(x => x.Student).Unique().Cascade.All();
}

public StudentMap()
{
Id(x => x.Id).GeneratedBy.Guid();
HasOne(x => x.Setting).Cascade.All().PropertyRef("Student");
}

[/csharp]

Associação de chave primária é a melhor solução, mas deve ser usado somente quando você tem certeza absoluta de que a associação será sempre um-para-um. Note-se que AllDeleteOrphan cascade não é suportado no um-para-um em NH.

Para maiores detalhes acesse:

http://fabiomaulo.blogspot.com/2010/03/conform-mapping-one-to-one.html

http://ayende.com/blog/3960/nhibernate-mapping-one-to-one

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Preencha esse campo
Preencha esse campo
Digite um endereço de e-mail válido.
Você precisa concordar com os termos para prosseguir

Menu