2009-02-01 67 views
3

我想弄清楚如何在nhibernate中将组件映射为主键,并且如果可能的话,还要使用流畅的nhibernate。如何映射也是NHibernate hbm xml(或者流利的nhibernate类映射)中的主键的组件?

有问题的部件是一套独特的三维坐标,这里的对象:

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

SpaceCoordinate是定义一个结构如下:

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

在功能NHibernate使SpaceCoordinate一及部件我会创建一个映射类如下:

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(); 
    } 
} 

但是我w我们想知道的是如何使SpaceCoordinate组件作为一个整体成为唯一约束的主键。我如何将它映射到Nhibernate xml或者流利的nhibernate类图中?

回答

2

我相信,除非你在NHibernate主干上运行,否则你不能这样做。直到2.0发布后才加入component上的unique属性;所以除非有解决办法,否则我认为这是不可能的。

您是否可以将字段映射为composite-id

2

现在使用的应该是可能

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); 
    } 
}