What are the advantages/disadvantages to each method?
I know I've read somewhere in either a book or on this site why using table inheritance is crappy for Entity Framework 4.
For instance, why not make one table which has an entityId, datecreated, datemodified and then have every other class inherit that in entity framework? Then my tables for all other entities don't need to have those columns. Then I can have a person class inherit that base class, and then a specific person inherit person.
I am not sure of the advantages of this though other than writing a smaller SQL script to generate the database...
Disadvantages I see are that it makes querying /viewing the data directly in SQL a big pain in the ass (all relevant information is broken across so many tables), and I also asked my friend who said:
"The biggest thing that sticks out for me is the fact that i wouldn't want my database to rely on the current inheritance structure of my application. if, for whatever reason, i wanted to change the design of my application in terms of inheritance, it wouldn't matter because my data wouldn't be reliant on my current system design. i think of data storage as just that--storage. the database is normalized according to proper database design, but inheritance is a programatic choice of application development, not data storage. that alone would prevent me from using it. inheritance is a very difficult thing to do properly when it comes to designing an application. it's much easier to change application code than it is to change and migrate database data when most less-seasoned devs approach a problem they approach it with inheritance. i did too when i first started developing. it logically makes sense. however once developing for a long time you learn that delegation is really the best way to go (services calling services in the case of soa) and that single-purpose services provide a lot more reuse than inheritance."
Which also makes sense to me.
So
1) In general, what are the pros/cons of inheritance vs extending
2) In my specific example above, what would be more appropriate?
3) If my example is crappy for either or both, what is a good example for using inheritance and for using extending?
I've used both before but as I am far from seasoned, I am still unsure how to handle all situations.
10 Votes, 8 favorited, over a hundred views and no one can expand? =(.
I have tried similar thing as you describe, and the main problem I see, is that u can't create ObjectSet<T>
for derived type. So you will not have ObjectSet<Person>
repository.
If you derive all your Entities from for example BusinessObject entity, you will be able to work only with ObjectSet<BusinessObject>
. If you want to query only Person repository, you can write query like Context.BusinessObjectSet.OfType<Person>().ToList()
but i think it will not generate proper SQL under the hood and will first get full BusinessObject rows and then filter out Person entities in memory. So I guess it will have huge performance impact.