2009-02-01 15 views
3

J'essaie de comprendre comment mapper un composant comme une clé primaire dans nhibernate et si possible dans nhibernate fluent aussi bien.Comment mapper un composant qui est également une clé primaire dans NHibernate hbm xml (ou dans une carte de classe fluent-nhibernate)?

Le composant en question est un ensemble unique de coordonnées 3D, voici l'objet:

public class SpaceLocation 
{ 
    public virtual SpaceCoordinate Coordinates { get; set; } 
    public virtual SpaceObject AtLocation { get; set; } 
} 

SpaceCoordinate est une structure définie comme suit:

public struct SpaceCoordinate 
{ 
    public int x { get; set; } 
    public int y { get; set; } 
    public int z { get; set; } 
} 

En NHibernate couramment pour faire SpaceCoordinate un componet Je voudrais créer une classe de cartographie comme ceci:

public class SpaceLocationMap : ClassMapWithGenerator<SpaceLocation> 
{ 
    public SpaceLocationMap() 
    { 
     References(x => x.AtLocation); 
     Component<SpaceCoordinate>(x => x.Coordinates, m => 
     { 
      m.Map(x => x.x); 
      m.Map(x => x.y); 
      m.Map(x => x.z); 
     }).Unique(); 
    } 
} 

Mais ce que je w Vous aimeriez savoir comment faire du composant SpaceCoordinate dans son ensemble la clé primaire avec sa contrainte unique. Comment est-ce que je pourrais mapper ceci dans Nmlernate xml, ou dans un classpath nhibernate fluide?

Répondre

2

Je crois qu'à moins que vous ne fonctionniez sur le tronc NHibernate, vous ne pouvez pas faire cela. L'attribut unique sur component n'a été ajouté qu'après la publication de la version 2.0; Donc, à moins qu'il y ait moyen de contourner cela, je ne pense pas que ce soit possible.

Êtes-vous en mesure de mapper les champs en tant que composite-id à la place?

2

il devrait être possible en utilisant maintenant

public class SpaceLocationMap : ClassMap<SpaceLocation> 
{ 
    public SpaceLocationMap() 
    { 
     CompositeId(x => x.Coordinates) 
      .KeyProperty(x => x.x) 
      .KeyProperty(x => x.y) 
      .KeyProperty(x => x.z); 

     References(x => x.AtLocation); 
    } 
}