Как сопоставить компонент, который также является первичным ключом в NHibernate hbm xml (или в карте классов fluent-nhibernate)?

Я пытаюсь выяснить, как сопоставить компонент в качестве первичного ключа в nhibernate и, если возможно, в свободном 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();
    }
}

Но я хотел бы знать, как сделать компонент SpaceCoordinate в целом первичным ключом с его уникальным ограничением. Как мне отобразить это в Nhibernate xml или в свободной карте классов nhibernate?


person Mark Rogers    schedule 01.02.2009    source источник


Ответы (2)


Я считаю, что вы не сможете этого сделать, если не используете транк NHibernate. Атрибут unique в component не был добавлен до выхода версии 2.0; так что, если нет способа обойти это, я не думаю, что это возможно.

Можете ли вы сопоставить поля как составной идентификатор вместо этого?

person James Gregory    schedule 02.02.2009

теперь это должно быть возможно, используя

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);
    }
}
person Firo    schedule 23.11.2011