I would generally classify that as a bad, or at least poor, practice. Reflection cost comes in several degrees, the highest cost of which is invocation (i.e. call method, get or set property/field value, etc.) By saving your object via reflection like that, you are incurring a very high cost. Were talking several orders of magnitude slower than directly accessing the properties.
Reflection cost aside, this is also generally bad practice from an intent standpoint. You are saving ALL properties...but what happens when someone creates a derived type that has properties that do not map to a database table column? You should make your save method virtual or abstract, and implement/extend the method as needed for each entity.
On a final note...handling saving directly on an entity like that is a true maintenance nightmare just waiting to happen. You are asking for a HELL of a lot of trouble as you are mixing concerns and responsibilities into a single class. You would be much better off making your entities/business objects POCO (plain old clr objects), and writing explicit data mappers. This will separate your concerns, and reduce the responsibilities of each class to as few as possible. Rich, self-saving (and loading) entities are convenient, but mostly a dream. In practice, they are usually not worth the small benefit they offer in light of the much greater maintenance difficulties you will have.
I recommend looking into OR mappers (LINQ to SQL, nHibernate, Entity Framework v4, etc.) OR mappers automatically generate SQL for you when you need to load, save, or delete entities. They can eliminate a considerable amount of extra coding required when you don't use an OR mapper, and support a much more adaptable code base.