Hi,
With respect to your question about bad design - I wouldn't say that it is bad, but some may consider it a bit "smelly", ie., it COULD indicate some design problems. But then again, if you've considered that this is the best way to go, then it could be okay for the particular case you are coding for.
The Domain Driven Design (DDD) approach is to reference all children of the aggregate through the aggregate root. It's fine to have transitory direct references to children from code outside of the aggregate, however, in general you should channel all referencing through the root. This helps keep references under control, avoiding any potential memory and invalid reference problems.
"An AGGREGATE is a cluster of associated objects that we treat as a unit for the purpose of data changes. Each AGGREGATE has a root and a boundary. The boundary defines what is inside the AGGREGATE. The root is a single, specific ENTITY contained in the AGGREGATE. The root is the only member of the AGGREGATE that outside objects are allowed to hold references to, although objects within the boundary may hold references to each other." - Domain Driven Design, by Eric Evans
So, I guess what I am getting at is - if you've got a reference to the child already, shouldn't you also already know who the parent is (since you would have obtained it through the root)? But, like I said, you could be addressing a corner case in which case your current design could be perfectly valid.
Leigh