3 Stimmen

Wie kann man eine Komponente, die auch ein Primärschlüssel ist, in NHibernate hbm xml (oder in einer fluent-nhibernate class map) abbilden?

Ich versuche herauszufinden, wie man eine Komponente als Primärschlüssel in nhibernate und wenn möglich auch in fluent nhibernate zuordnen kann.

Bei der fraglichen Komponente handelt es sich um einen eindeutigen Satz von 3D-Koordinaten, hier ist das Objekt:

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

SpaceCoordinate ist eine Struktur, die wie folgt definiert ist:

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

In fluent nhibernate, um SpaceCoordinate zu einer Komponente zu machen, würde ich eine Mapping-Klasse wie diese erstellen:

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

Aber was ich gerne wissen würde, ist, wie man die SpaceCoordinate-Komponente als Ganzes zum Primärschlüssel mit seiner eindeutigen Einschränkung macht. Wie würde ich dies in Nhibernate xml oder in einer fließenden Nhibernate Classmap abbilden?

2voto

James Gregory Punkte 14055

Ich glaube, dass Sie dies nicht tun können, es sei denn, Sie arbeiten mit NHibernate trunk. Die unique Attribut an component wurde erst nach der Veröffentlichung von 2.0 hinzugefügt; wenn es also keinen Weg gibt, dies zu umgehen, glaube ich nicht, dass es möglich ist.

Können Sie die Felder als zusammengesetzte-id stattdessen?

2voto

Firo Punkte 29738

Sollte es jetzt möglich sein, mit

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X