Frage

Ich verwende eine benutzerdefinierte benannte Abfrage mit NHibernate, die eine Sammlung von Person-Objekten zurückgeben möchte.Das Person-Objekt ist keiner NHibernate-Zuordnung zugeordnet, was bedeutet, dass ich die folgende Ausnahme erhalte:

System.Collections.Generic.KeyNotFoundException:Der angegebene Schlüssel war im Wörterbuch nicht vorhanden.

Es wird ausgelöst, wenn die Sitzung erstellt wird, da der Klassenname beim Aufruf von NHibernate.Cfg.Mappings.GetClass(String className) nicht gefunden werden kann.Das ist alles ziemlich verständlich, aber ich habe mich gefragt, ob es eine Möglichkeit gibt, NHibernate anzuweisen, die Klasse zu verwenden, obwohl ich keine Zuordnung dafür habe?

War es hilfreich?

Lösung 5

Um dies zu lösen, ich am Ende der TupleToPropertyResultTransformer verwenden und die Liste des Eigenschaftswertes bereitstellt. Es gibt ein paar Einschränkungen dazu, die im wesentlichen darauf, dass die SQL-Abfrage, die Ergebnisse in der gleichen Reihenfolge zurückgeben muß, wie Sie Ihre Eigenschaften zum TupleToPropertyResultTransformer Konstruktor bieten.

Auch die Immobilienart abgeleitet, so dass Sie mit Dezimalspalten vorsichtig sein müssen Rückkehr nur ganzzahlige Werte usw. Abgesehen davon, dass die TupleToPropertyResultTransformer mit einem recht einfachen Weg zur Verfügung gestellt eine SQL-Abfrage zu verwenden, um eine Sammlung von Objekten, ohne explizit Zuordnung der zurück Objekte innerhalb NHibernate.

Andere Tipps

Warum verwenden Sie nicht:

query.SetResultTransformer(Transformers.AliasToBean(typeof(Person)));

Es fügt Daten aus jeder Spalte Ihrer Abfrage in die Eigenschaften des Personenobjekts ein und verwendet dabei den Spaltenalias als Eigenschaftsnamen.

Wie können Sie eine Abfrage erstellen, die Instanzen eines Typs zurückgeben würde, die nicht abgebildet ist?

Ich denke, Michal hat einen Punkt hier, und vielleicht sollten Sie einen Blick auf Projektionen haben. (Zumindest das ist, was ich denke, Sie suchen).

Sie erstellen eine Abfrage auf einige kartiert Typ, und dann können Sie ‚Projekt‘ die Abfrage zu einem ‚DTO‘. Um dies zu tun, werden Sie zu ‚importiert‘ haben Ihrer Person-Klasse, so dass es zu NHibernate bekannt ist, und Sie werden einen ResultTransformer verwenden.

So etwas wie folgt aus:

ICriteria crit = session.CreateCriteria (typeof(Person));

// set some filter criteria

crit.SetProjection (Projections.ProjectionList()
                     .Add (Property("Name"), "Name")
                     .Add (Property( ... )
                   );

crit.SetResultTransformer(Transformers.AliasToBean(typeof(PersonView));

return crit.List<PersonView>();

Aber das bedeutet noch Sie

Durch die Klasse verwendet wird, würde NHibernate sein im Grunde alles, was zu raten beteiligt, einschließlich der Tabelle, die Sie für die Person zu verwenden, bedeuteten, und die Feldzuordnungen. NHibernate könnte wahrscheinlich gehackt werden dynamisch zu tun Bindung basierend auf den Namen passenden oder etwas, aber die ganze Idee ist es, die Zuordnungen von einfachen alten Datenobjekt in die Datenbank-Felder unter Verwendung der XML-Dateien zu erstellen.

Wenn es gibt nicht einen wirklich guten Grund, nicht die Klasse abzubilden, einfaches Hinzufügen der Zuordnung gibt Ihnen die besten Ergebnisse ...

Das heißt, können Sie keine benannte Abfrage verwenden, um direkt Ergebnisse in eine nicht zugeordneten Klasse zu injizieren. Sie würden ihm, in denen die Spalten sagen müssen setzen Felder oder in anderen Worten, eine Abbildung. ;) Sie können jedoch skalare Werte von einer benannten Abfrage zurückgeben und Sie können manuell das Objekt Arrays und bauen Sie Ihre Sammlung nehmen

.
scroll top