Frage

Ich habe eine Datenstruktur, die Composite-ids verwendet (was ich möchte nicht auf einzelne ändern) Alles in Ordnung, außer Lasten für viele-zu-eins-Verbindungen, bei denen, wenn die Verbindung leer ist, statt die Abbildung der Eigenschaft auf null, ordnet sie in einen leeren Proxy-Objekt. Ich habe eine hässliche Arbeit um (siehe bleow) geschrieben. Jede Lösung für dieses?

Private Node _parent;

    public Node Parent
    {
        get
        {
            return this._Parent;
        }
        set
        {
            this._Parent = Proxy.Check<Node>(value);
        }
    }
internal static class Proxy
{
    public static T Check<T>(T obj) where T : PersistentObject
    {
        if (obj is NHibernate.Proxy.INHibernateProxy && obj != null)
        {
            try 
            {
                int id = obj.ID;
                return obj;             
            }
            catch //Proxy only object cant retrieve ID
            {
                return null;
            }
        }
        else
        {
            return obj;
        }
    }

}

mit dem Mapping-Datei Anfang

<class name="Node" table="Node">
    <composite-id>
        <key-property name="ID"/>
        <key-property name="VersionID"/>
    </composite-id>

und der Zugriff durch

    <many-to-one name="Node" class="Node" >
        <column name="NodeID"/>
        <column name="VersionID" />
    </many-to-one>
War es hilfreich?

Lösung

Nicht ganz sicher, ob dies die perfekte Lösung für diese Situation ist, aber dies das Problem behoben für mich, wenn ich das gleiche Problem aufgetreten, während auf einem alten DB mit zusammengesetzten Schlüsseln arbeiten.

Durch die Einstellung nicht gefunden auf Ihren Links zu ignorieren, wird NHibernate leer Objekte als null behandelt statt Ausnahmen. Bei dieser Technik wird NHibernate eine separate Abfrage ausführen, so dass es kleiner Leistungs Treffer sein kann, wie dies grundsätzlich bestrebt ist, das Objekt zu laden.

Sie könnten nur versuchen eifrig das Objekt laden, anstatt diese Technik zu verwenden, aber ich habe das Gefühl, es wäre eine Ausnahme zurück, wie es ein Objekt (nicht null) erwarten würde. Ich würde vorschlagen, eine Frage in den NHibernate-Foren veröffentlichen, wenn dies nicht, wie ich in diesem Bereich auf jeden Fall keinen Experte ist nicht funktioniert, aber dies kann eine kleinere / weniger hässliche Arbeit um für Sie.

Zum Beispiel:

<many-to-one name="Node" class="Node" not-found="ignore">
    <column name="NodeID"/>
    <column name="VersionID" />
</many-to-one>

Hope, das hilft,

Jay

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top