Domanda

Ho una struttura di dati che utilizza ID compositi (che non desidero cambiare in singolo) Tutto si carica bene tranne i join molti-a-uno che se il join è vuoto, invece di mappare la proprietà su null, la mappa su un oggetto proxy vuoto. Ho scritto un brutto lavoro in giro (vedi bleow). Qualche soluzione a questo?

Nodo privato _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;
        }
    }

}

con l'inizio del file di mappatura

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

e accessibile da

    <many-to-one name="Node" class="Node" >
        <column name="NodeID"/>
        <column name="VersionID" />
    </many-to-one>
È stato utile?

Soluzione

Non sono esattamente sicuro che questa sia la soluzione perfetta per questa situazione, ma questo ha risolto il problema quando ho riscontrato lo stesso problema mentre lavoravo su un vecchio DB con chiavi composite.

Impostando non trovato per ignorare sui tuoi collegamenti, NHibernate tratterà gli oggetti vuoti come null anziché eccezioni. Quando si utilizza questa tecnica, NHibernate eseguirà una query separata, pertanto potrebbero verificarsi piccoli risultati nelle prestazioni, poiché questo è sostanzialmente desideroso di caricare l'oggetto.

Potresti provare semplicemente a caricare l'oggetto invece di usare questa tecnica, ma ho la sensazione che restituirebbe un'eccezione in quanto si aspetterebbe un oggetto (non nullo). Suggerirei di pubblicare una domanda nei forum di NHibernate se questo non funziona in quanto non sono sicuramente un esperto in questo settore, ma potrebbe trattarsi di un lavoro più piccolo / meno brutto per te.

Ad esempio:

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

Spero che questo aiuti,

Jay

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top