First question: how complex are your components? Recalculating the price each time may not be a problem, and means that you have no issues with caching and making sure updates work.
What you essentially want for rebuilding the prices is a reverse tree: starting from the component that you changed the price on, look up all its ancestors and update their prices. Pseudocode:
void UpdatePrice(Component target, decimal newPrice){
target.Price = newPrice;
List<Component> parents = select from components where componentWithUpdatedPrice in Children;
foreach(Component p in parents){
UpdatePrice(p, p.RecalculatePrice());
}
}
You can probably write that query as a bona fide LINQ query but I forget the syntax. I don't see any way to avoid recursion as it's tree walking. If your system permits circular references then you also need to leave yourself a 'passing note' so you don't get into an infinite loop.