2010-11-16 14 views
6

Ich konnte keine Antwort auf dieses Problem finden, also nehme ich an, dass ich etwas falsch mache.Flüssige NHibernate LazyLoad Probleme

Ich habe einen PersistenceModel eingerichtet, wo ich eine Konvention festgelegt haben, wie folgt: -

persistenceModel.Conventions.Add(DefaultLazy.Always()); 

jedoch für eine der HasManyToMany Beziehungen in einer meiner Entitäten ich eifrig Laden stattfinden soll, die ich bin Einrichtung wie folgt: -

HasManyToMany(x => x.Affiliates).Not.LazyLoad(); 

Intuitiv erwarte ich eifrig Laden stattzufinden, als ich die faule Urladen bin überschrieben, die ich als Konvention festgelegt haben, aber es immer noch faul Lasten. Wenn ich die DefaultLazy-Konvention auf "nie" und dann auf "LazyLoad" auf eine einzelne Beziehung einstelle, funktioniert dies auch nicht.

Irgendwelche Ideen?

Antwort

9

Wenn Sie Not.LazyLoad() festlegen, weisen Sie NHibernate an, Affiliates zu laden, wenn das übergeordnete Element geladen wird. NHibernate führt dies durch, indem eine weitere Auswahl in der Affliates-Viele-zu-Viele-Tabelle durchgeführt wird, unabhängig davon, ob Sie auf die Affiliates-Sammlung zugreifen oder nicht. NHibernate verwendet eine andere Auswahl, da dies der Standard-Abrufmodus ist. Sie möchten den Abrufmodus auch in der Abfrage oder im Mapping überschreiben. Um es in der Abbildung zu tun, fügen Sie die folgenden Schritte aus:

HasManyToMany(x => x.Affiliates) 
    .Not.LazyLoad() 
    .Fetch.Join(); 

Sie könnten auch eine „.Cascade.AllDeleteOrphan()“ aufnehmen möchten, wenn Sie NHibernate wollen neue Affiliaites bestehen bleiben hinzugefügt, um die Sammlung und verwaiste löschen. Wenn Sie dies nicht tun, müssen Sie explizit session.Save (newAffiliate) aufrufen. Andernfalls erhalten Sie eine TransientObjectException, wenn Ihre Affiliates-Sammlung einen neuen Partner enthält.

+0

Entschuldigung, ich entfernte die Teile des Codes, die ich hier nicht für relevant hielt. Ich habe .FetchType.Join() auch und deaktivieren Lazy Loading noch nicht funktioniert. Die einzige Möglichkeit, Lazy Loading auszuschalten, habe ich bei der Einstellung der Konvention gefunden. – Dotnet

+0

Ich habe die DefaultLazy.Always() Konvention hinzugefügt und die HasManyToMany() Beziehung lädt korrekt, wenn Fetch.Join() angewendet wird. Sie können meine Probe von GitHub hier: https://github.com/JamesKovacs/JamesKovacs.StackOverflow/tree/master/FluentNhHacking/ –

+0

In Ordnung, nun, ich habe ziemlich viel Code in meiner Situation nachgemacht und es hat immer noch nicht funktioniert, also werde ich es mir genauer ansehen müssen. Ich verwende .ShowSql(), um zu bestimmen, ob die Abfragen träge oder eifrig ausgeführt wurden, was ich für richtig halte. – Dotnet

0

Es kann eine blöde Sache sein zu fragen, aber haben Sie die Abfrage innerhalb Ihrer Sitzung ausführen? Sprich:

Using(var session = OpenSession()) 
{ 
    session.Query<Entity>().ToList(); 
} 

Ich habe dieses Problem vor, und schließlich die Objekte realisiert, dass ich vor der Entsorgung die Sitzung nicht abgefragt worden war, wurde Zugriff.

Verwandte Themen