I've made it one step further.
It looks like this issue is with the Parent property. NHibernate
stateless sessions do not seem to work with non-lazy loaded/non-join
fetched items. I would much rather it ignore those associations
rather than cause an exception, but whatever.
If I join fetch the parent it works. For one level deep. Anything
deeper, and the parent attempts to load the grand-parent and fails.
new DetachedQuery("from Model m inner join fetch m.Parent par where
m.Parent = :p").SetParameter("p", current)
So, I need to set the Parent BelongsTo association be lazy loaded.
But I already though I had done that. My property looks like this:
[BelongsTo(Lazy=FetchWhen.OnInvoke)]
public Model Parent { get; set; }
The other side is lazy as well, but that seems to work:
[HasMany(Lazy=true)]
public IList<Model> Children { get; set; }
Why does this still load the entire chain of parents for each query?
How do I set this to lazy load properly?
Thanks.
On Jul 14, 10:15 pm, Dan Jasek <[email protected]> wrote:
> I have a tree structure in a database I am accessing through AR. My
> goal is a function to walk the tree. I want to put this in a
> stateless session because the tree can be very large and I don't want
> to spend the resources on the first level cache if it is not
> necissary.
> But I can't seem to get the list of children to work properly in the
> stateless session.
>
> This is what I have so far:
>
> void WalkTree(Model root, Action<Model> work) {
> using (new StatelessSessionScope()) {
> rWalkTree(root, work);
> }
>
> }
>
> void rWalkTree(Model current, Action<Model> work) {
> work(current);
> foreach(Model child in Model.FindAllByProperty("Parent", current))
> {
> rWalkTree(child);
> }
>
> }
>
> This works fine the first time through the foreach, but errors out
> when run on the first child. I assume it worked the first time
> because current was root which is instantiated outside of the
> stateless session scope.
>
> When it errors, it throws the an exception with the inner exception is
> "could not execute query..." and it's inner exception is "possible non-
> threadsafe access to the session", which seems odd (it is all on one
> thread).
>
> I have tried a Detached Query and a SQL Query as well. Both of which
> causes the same error, the first time through the foreach.
>
> All of these methods work fine on a standard session scope.
> Am I doing something wrong, or is there a better way to do this?
--
You received this message because you are subscribed to the Google Groups
"Castle Project Users" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to
[email protected].
For more options, visit this group at
http://groups.google.com/group/castle-project-users?hl=en.