Usually with a Customer object I would fully populate it. Although you want the possibility of multiple addresses etc you normally have only one or two and you tend to be dealing with a single customer at a time. However, if you start having many sub objects or are dealing with many customers at a time (say for a report) I would remove all the sub objects (I usually use poco to mean only simple objects) and expose the relationships via the repository. ie repo.GetAddressesForCustomer(customerId) class Address { string CustomerId {get;set;} ... } This allows you to, limit your returned data to only that which is needed and also to optimise your queries for the specific dataset you want to retrieve