2009-07-22 11 views
1

auf Eigenschaften in meinen Domain-Objekten zu verhindern, die ich faul Laden nicht wollen, lassen Sie mich den virtuellen Modifikator, und auch die Zuordnungsdatei aktualisieren diese mit zum Beispiel zu reflektieren:Wie NHibernate Erstellen ein DAO-Proxy für verzögertes Laden

<property name="UserName" column="Name" type="String" length="40" lazy="false"/> 

Ich hätte aber, dass das Setzen der Eigenschaft faul auf falsch würde es akzeptieren, dass die relevante Eigenschaft innerhalb der Domain-Objekt nicht virtuell sein.

Kann mir jemand erklären, wie ich kann nicht meine eifrigen Last Eigenschaften virtuellen machen Ich möchte einfach:

public string UserName{ 
    get{ return _userName; } 
    set{ _userName = value; } 
} 

Vielen Dank,

Andrew

+0

http://davybrion.com/blog/2009/03/must-everything-be-virtual-with-nhibernate/ –

+0

Ich fand einen Artikel, der dies erklärt, und mit diesem Slogan: "Das ist eine Frage, die viele Leute Wer ist neu in NHibernate haben "lol danke sowieso –

Antwort

2

Ich glaube nicht, Eigenschaften geladen faul sein kann - nur Sammlungen und Verweise - es sei denn, das Laden nach Spalte wurde kürzlich hinzugefügt.

Ich bin mir nicht sicher, was lazy="false" auf diese Eigenschaft in NHibernate tut.

+0

Es ist komisch, weil es beschwert, dass es die Eigenschaften virtuell sein will. –

+1

Yah. Es macht alle Eigenschaften virtuell, weil es in der Lage sein soll, die Entity als Ganzes zu laden. – anonymous

+1

Als ein Beispiel ... Telefon hat eine viele-zu-eins mit Benutzer. Telefon ist in der Sitzung, aber Benutzer ist faul geladen. Phone.User.UserName würde zu einer Datenbankabfrage führen, um das Benutzerobjekt zu erstellen. Aus diesem Grund muss User.UserName virtuell sein. – anonymous

0

http://davybrion.com/blog/2009/03/must-everything-be-virtual-with-nhibernate/

Der folgende Artikel erklärt die sehr deutlich Grund. Danke für die Eingabe. Schätzen Sie es

+0

"Answers", die Antwort auf einem externen Link zu lesen, werden abgeraten, da die Seite verloren gehen kann. Sie sollten zusätzlich die relevanten Teile in Ihrer Antwort zitieren oder eine eigene Zusammenfassung liefern. –

0

Wenn Ihre gesamte Entität in nicht-faul ist, können Sie es ohne etwas virtuell deklarieren. Dies erfordert die Einstellung lazy="false" auf der <class> Zuordnung.

Wenn Ihre Entität die Lazy-Load-Unterstützung unterstützen muss, müssen alle nicht privaten Member als virtuell deklariert sein, damit Lazy-Loading einen Proxy dafür erstellen kann.

Wenn eine Entity faul geladen ist, gibt NHibernate nur einen Proxy zurück, der daraus abgeleitet wird und seine Id enthält, und sonst nichts. Jeder Zugriff auf andere Mitglieder löst das Laden aus. Damit dies funktioniert, müssen sie alle virtuell sein.

Wenn Sie Eigenschaften haben möchten, die nicht lazy-loaded sind, bedeutet das in der Tat, dass Sie das Lazy-Loading für die Entity deaktivieren und möglicherweise das Lazy-Loading für einige Eigenschaften aktivieren möchten. Das lazy Attribut auf <property> ist dafür da. Dieser Mechanismus erfordert immer noch, die Entität zu verkörpern, obwohl sie nicht faul geladen ist. Ich habe das nicht überprüft, aber zumindest müssen die lazy loaded-Eigenschaften virtuell sein, und wahrscheinlich müssen alle anderen nicht-privaten Mitglieder weiterhin virtuell sein.
Beachten Sie, dass ein solches Lazy Loading derzeit nicht stapelweise erfolgt und daher anfällig für die Auswahl von n + 1 Performance-Problemen ist, selbst wenn batch fetching of lazy loads aktiviert ist.

Verwandte Themen