Frage

Ich habe einige Post zu holen = beitreten - http://nhforge.org/blogs/nhibernate/archive/2009/04/09/nhibernate-mapping-lt-many-to-one-gt.aspx (ser4ik.livejournal.com/2505.html) Also habe ich einige Fragen haben, Forexample Ich habe Klasse

<class name="AttributesInf" table="attr_inf">      
 <id name="Id">
   <generator class="identity"/>
 </id>
 <property name="Name" />
    <property name="Desc"/>
</class> 

und

<class name="AttributeValue" table="attr_val">      
 <id name="Id">
   <generator class="identity"/>
 </id>
 <property name="Value" />
 <many-to-one name="AttrName" column="attrId"/>
</class> 

Wenn ich diese Zuordnung ohne Set verwenden holen = "join" ich sql:

Select av.Id, av.Value, av.attrId From attr_val av where av.Id=...()

und nach dann separaten SQL-Abfragen wie:

Select * From attr_inf where Id = av.attrId

Also mein Ergebnis ist:

class AttrinuteInf 
{ 
int Id; 
string Name; 
string Desc; 
} 
class AttributeValue 
{ 
int Id; 
string  Value; 
AttributeInf AttrName;
}

Wenn ich gesetzt holen = "join" dann bekomme ich eine Abfrage:

Select u.Id, u.UserName, u.BlogId, b.Id, b.BlogName, b.BlogAuthor, b.BlogMsg 
from Users u
Left outer join Blogs b 
On u.BlogId=b.Id
Where u.Id = ...

So erwarte ich eine Klasse zu erhalten:

class AttributeValue
{
int Id;
string  Value;
string Name;
string Desc;
}

Aber ich habe das gleiche Ergebnis wie wenn ich nicht auf „join“ gesetzt holen.

Ist das in Ordnung? Gibt es eine Möglichkeit, Eigenschaften von Klasse zu erhalten maped als <many-to-one> direkt? (Nicht als AttrName.Name, sondern einfach Name)

Erklärung:

Ein Teil des Abbildungssatzes über nicht mein eigentliches Problem zeigen. Ich möchte einige Unternehmen als IDictionary<string,AttributeValue> abzubilden. I wo es sich als

<map name="Attributes" table="attr_val" lazy="true" cascade="all-delete-orphan" inverse="true">
<key column="item_id"></key>
<index column="name"></index> //I don't have that item in class AttributeValue, that is why I try to get it from other table
<one-to-many class="AttributeValue"/>
</map>
War es hilfreich?

Lösung

Dies ist nicht das, was Sie denken, es tut. Mit Hilfe holen = kommen nur dort eifrig Last der vielen Seite der Beziehung. In beiden Fällen erhalten Sie mit den gleichen Objekten zurückgegeben werden. In der Standardeinstellung NHibernate wird faul Last die damit verbundenen Einheiten (die, warum Sie die zweite Abfrage erhalten). Durch die Verwendung holen = verbinden Sie für das gesamte Objekt Beziehung auf einmal fragen, aber es wird immer noch bevölkern die die gleichen Objekte wie ohne die Abruf- = verbinden.

Andere Tipps

Es ist nicht so, wie Sie es beschreiben. Ihre Einheiten nicht ändern, je nachdem, was Sie verlangen.

Sie erhalten eine Liste von Instanzen Ihrer Haupt-Einheit, mit dem Verein erhalten, um das andere geholt. Also, wenn in Ihrem Code Sie den Verein zugreifen, werden Sie die Werte finden.

Wenn Sie es nicht holen, würden Sie nicht in der Lage sein, diese Felder zugreifen, da sie nicht aus der Datenbank abgerufen worden wären.

Ich verstehe Ihre Frage nicht. Das ‚Fetch-join‘ Attribut nur definiert, wie die SQL, dass NHibernate erzeugt Instanzen von Klassen abgerufen wird, aussehen sollte. Es hat nichts mit dem zu tun, ‚was‘ zurückgegeben wird. NHibernate wird das Re-Cord übersetzen (die das Ergebnis der Abfrage ist), um die korrekten Instanzen Ihrer Klassen.

Wenn Sie wollen nur Teile des Unternehmens abgerufen werden (wie der Name zum Beispiel), dann werden Sie eine HQL-Abfrage zu schreiben, oder die ICriteria API verwenden und vielleicht Projektionen verwenden.

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