This is a list for the IDEAL O/R Framework is somewhat based on a similar list in ObjectRelationalToolComparison (Very similar to this list just for Java instead of DotNET.) but has a lot of .NET specific "extra-features". I am 100% sure there is no ORM .NET product that matches all this requirements, but I would like to know how close ORM.NET is to the "Ideal"
* 1. Release Version Number (To indicate which version has been refered to, Maturity)
* 2. "Free" as in "free beer" - no license fee
* 3. "Free" as in "free speech" - source available
* 4. Has mapping GUI (For DataBase to Objects, and Objects to Database)
* 5. .NET ErrorProviderSupport? and DataBinding? Support (without me coding ANYTHING) for WindowsForms.NET
* 6. Does not requires manual SQL building, but can easily accept SQL based queries.
* 7. RDBMS support/independence, and the user can easily add support for other databases or persistent mechanisms (XML, Prevalence, etc).
* 8. Integration with an MVC framework (like User Interface App Block) o Metaframework (SpringFramework in Java, for example) for both ASP.NET and WindowsForms (Why we need ObjectRelationalIntegrationWithModelViewController?)
* 9. Supports relationships between objects (User can choose the names and types of the foreign keys)
* 10. Mapping supports grouping (GROUP BY clause)
* 11. Mapping supports aggregate functions (count(), avg(), etc.)
* 12. Includes full support of lazy resolution of all queries
* 13. Maintains single identities for objects returned from queries (aka "uniquing") (i.e., AddressFinder?.findById(1) == AddressFinder?.findById(1));
* 14. Resolves Circular Identities (aka "uniquing") (i.e., "account == account.getCustomer().getAccount()")
* 15. Generates Mapping as well as the Objects themselves, so you don't duplicate information in the .NET Objects and the related mapping information.
* 16. Supports Composite Primary Keys (I don't like this, but sometimes is useful for legacy applications)
* 17. Aggregate Mappings - Single field maps to multiple fields in database. http://martinfowler.com/eaaCatalog/embeddedValue.html
* 18. Supports both many to many and one to many associations
* 19. Supports collections of Strings, Integers, Dates, etc
* 20. Supports inheritance / polymorphic queries
* 21. Supports one to one associations
* 22. Can fetch associated objects using SQL outer joins
* 23. Support for optimistic locking / versioning
* 24. Support for Unit of work / object level transactions
* 26. Providing an ODMG compliant API and/or OCL and/or OPath
* 27. Does NOT require "extra" database tables holding locks, metadata, etc.
* 28. Supports multiservers (clustering) and simultaneous access by other applications without loss of transaction integrity
* 29. This is a question: Requires code generation?
* 30. This is a question: Requires RuntimeReflection??
* 31. Query Caching - Built-in support (developer writes no code). The following two identical queries will hit the database only once. The second time cached results will be returned. Address address = AddressFinder?.selectByPrimaryKey(new Long(1)); assertTrue(address == AddressFinder?.selectByPrimaryKey(new Long(1)));
* 32. Supports sequences and identity/autoincrement columns for primary key generation (Not using the incorrect SELECT MAX method!) (The user can choose the name and type of the primary key field)
* 33. Supports ternary associations
* 34. Supports mapping of one class to multiple tables ( Sometimes legacy databases leave you no choice.)
* 35. Supports mapping of multiple classes to one table
* 36. Supports persistence of properties through private fields (Not very important for me, but I am curious)
* 37. Supports persistence of properties through accessors (get/set methods or properties, and they can be private)
* 38. Supports disconnected operations: Populate objects from database, disconnect, create/remove/modify objects (on client, another Process) and apply changes to database (much) later
* 37. Support for ASP.NET (Visually?, Out of the box).
* 38. Support for Remoting (Visually?, Out of the box). Distributed Objects.
* 39. Support for WebServices (Visually?,Out of the box).
* 40. Support for information exchange with System.Data.DataSet?.
* 41. In memory object filtering (Specifically ask for a complex filter on an ArrayList of Objects without hitting the database)
* 42. Batch Update (Update lots of objects without object creation).
* 43. Batch Delete (Delete lots of objects without object creation, for example this is very useful in Cascade Delete for ToMany? relationships).
* 44. Saving Changes with one line of code (ObjectsEngine?.CommitAllChanges?()), does all the inserts, deletes and updates in the right order, without user intervention, and without violating Master/Detail relationships.
You may have noticed that some features ask the question "Visually?", being able to visually databind your objects to the UI (and show errors with an ErrorProvider) is a very important feature for an O/R mapper in the .NET world (because, if a lot of users are going to want the ease of use of the DataSet when using your O/R Mapper in the development of WinUI (WindowsForms.NET) or WebUI (ASP.NET) applications
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
Fine with me.
Here is a breakdown on the current version of ORM.NET.
Version 2.0 will address some more of these features, and I will update when it becomes available.
Y 1. Release Version Number (To indicate which version has been refered to, Maturity)
Y 2. "Free" as in "free beer" - no license fee
Y 3. "Free" as in "free speech" - source available
N 4. Has mapping GUI (For DataBase to Objects, and Objects to Database)
N 5. .NET ErrorProviderSupport? and DataBinding? Support (without me coding ANYTHING) for WindowsForms.NET
Y 6. Does not requires manual SQL building, but can easily accept SQL based queries.
N 7. RDBMS support/independence, and the user can easily add support for other databases or persistent mechanisms (XML, Prevalence, etc).
N 8. Integration with an MVC framework (like User Interface App Block) o Metaframework (SpringFramework in Java, for example) for both ASP.NET and WindowsForms (Why we need ObjectRelationalIntegrationWithModelViewController?)
Y/N 9. Supports relationships between objects (User can choose the names and types of the foreign keys)
N 10. Mapping supports grouping (GROUP BY clause)
N 11. Mapping supports aggregate functions (count(), avg(), etc.)
N 12. Includes full support of lazy resolution of all queries
N 13. Maintains single identities for objects returned from queries (aka "uniquing") (i.e., AddressFinder?.findById(1) == AddressFinder?.findById(1));
Y 14. Resolves Circular Identities (aka "uniquing") (i.e., "account == account.getCustomer().getAccount()")
Y 15. Generates Mapping as well as the Objects themselves, so you don't duplicate information in the .NET Objects and the related mapping information.
Y/N 16. Supports Composite Primary Keys (I don't like this, but sometimes is useful for legacy applications)
N 17. Aggregate Mappings - Single field maps to multiple fields in database. http://martinfowler.com/eaaCatalog/embeddedValue.html
N 18. Supports both many to many and one to many associations
N 19. Supports collections of Strings, Integers, Dates, etc
N 20. Supports inheritance / polymorphic queries
Y 21. Supports one to one associations
N 22. Can fetch associated objects using SQL outer joins
N 23. Support for optimistic locking / versioning
N 24. Support for Unit of work / object level transactions
N 26. Providing an ODMG compliant API and/or OCL and/or OPath
Y 27. Does NOT require "extra" database tables holding locks, metadata, etc.
N 28. Supports multiservers (clustering) and simultaneous access by other applications without loss of transaction integrity
Y 29. This is a question: Requires code generation?
Y 30. This is a question: Requires RuntimeReflection??
N 31. Query Caching - Built-in support (developer writes no code). The following two identical queries will hit the database only once. The second time cached results will be returned. Address address = AddressFinder?.selectByPrimaryKey(new Long(1)); assertTrue(address == AddressFinder?.selectByPrimaryKey(new Long(1)));
N 32. Supports sequences and identity/autoincrement columns for primary key generation (Not using the incorrect SELECT MAX method!) (The user can choose the name and type of the primary key field)
? 33. Supports ternary associations
N 34. Supports mapping of one class to multiple tables ( Sometimes legacy databases leave you no choice.)
N 35. Supports mapping of multiple classes to one table
N 36. Supports persistence of properties through private fields (Not very important for me, but I am curious)
N 37. Supports persistence of properties through accessors (get/set methods or properties, and they can be private)
Y 38. Supports disconnected operations: Populate objects from database, disconnect, create/remove/modify objects (on client, another Process) and apply changes to database (much) later
N 37. Support for ASP.NET (Visually?, Out of the box).
N 38. Support for Remoting (Visually?, Out of the box). Distributed Objects.
N 39. Support for WebServices (Visually?,Out of the box).
Y 40. Support for information exchange with System.Data.DataSet?.
Y 41. In memory object filtering (Specifically ask for a complex filter on an ArrayList of Objects without hitting the database)
N 42. Batch Update (Update lots of objects without object creation).
N 43. Batch Delete (Delete lots of objects without object creation, for example this is very useful in Cascade Delete for ToMany? relationships).
Y 44. Saving Changes with one line of code (ObjectsEngine?.CommitAllChanges?()), does all the inserts, deletes and updates in the right order, without user intervention, and without violating Master/Detail relationships.
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
This is a list for the IDEAL O/R Framework is somewhat based on a similar list in ObjectRelationalToolComparison (Very similar to this list just for Java instead of DotNET.) but has a lot of .NET specific "extra-features". I am 100% sure there is no ORM .NET product that matches all this requirements, but I would like to know how close ORM.NET is to the "Ideal"
* 1. Release Version Number (To indicate which version has been refered to, Maturity)
* 2. "Free" as in "free beer" - no license fee
* 3. "Free" as in "free speech" - source available
* 4. Has mapping GUI (For DataBase to Objects, and Objects to Database)
* 5. .NET ErrorProviderSupport? and DataBinding? Support (without me coding ANYTHING) for WindowsForms.NET
* 6. Does not requires manual SQL building, but can easily accept SQL based queries.
* 7. RDBMS support/independence, and the user can easily add support for other databases or persistent mechanisms (XML, Prevalence, etc).
* 8. Integration with an MVC framework (like User Interface App Block) o Metaframework (SpringFramework in Java, for example) for both ASP.NET and WindowsForms (Why we need ObjectRelationalIntegrationWithModelViewController?)
* 9. Supports relationships between objects (User can choose the names and types of the foreign keys)
* 10. Mapping supports grouping (GROUP BY clause)
* 11. Mapping supports aggregate functions (count(), avg(), etc.)
* 12. Includes full support of lazy resolution of all queries
* 13. Maintains single identities for objects returned from queries (aka "uniquing") (i.e., AddressFinder?.findById(1) == AddressFinder?.findById(1));
* 14. Resolves Circular Identities (aka "uniquing") (i.e., "account == account.getCustomer().getAccount()")
* 15. Generates Mapping as well as the Objects themselves, so you don't duplicate information in the .NET Objects and the related mapping information.
* 16. Supports Composite Primary Keys (I don't like this, but sometimes is useful for legacy applications)
* 17. Aggregate Mappings - Single field maps to multiple fields in database. http://martinfowler.com/eaaCatalog/embeddedValue.html
* 18. Supports both many to many and one to many associations
* 19. Supports collections of Strings, Integers, Dates, etc
* 20. Supports inheritance / polymorphic queries
* 21. Supports one to one associations
* 22. Can fetch associated objects using SQL outer joins
* 23. Support for optimistic locking / versioning
* 24. Support for Unit of work / object level transactions
* 26. Providing an ODMG compliant API and/or OCL and/or OPath
* 27. Does NOT require "extra" database tables holding locks, metadata, etc.
* 28. Supports multiservers (clustering) and simultaneous access by other applications without loss of transaction integrity
* 29. This is a question: Requires code generation?
* 30. This is a question: Requires RuntimeReflection??
* 31. Query Caching - Built-in support (developer writes no code). The following two identical queries will hit the database only once. The second time cached results will be returned. Address address = AddressFinder?.selectByPrimaryKey(new Long(1)); assertTrue(address == AddressFinder?.selectByPrimaryKey(new Long(1)));
* 32. Supports sequences and identity/autoincrement columns for primary key generation (Not using the incorrect SELECT MAX method!) (The user can choose the name and type of the primary key field)
* 33. Supports ternary associations
* 34. Supports mapping of one class to multiple tables ( Sometimes legacy databases leave you no choice.)
* 35. Supports mapping of multiple classes to one table
* 36. Supports persistence of properties through private fields (Not very important for me, but I am curious)
* 37. Supports persistence of properties through accessors (get/set methods or properties, and they can be private)
* 38. Supports disconnected operations: Populate objects from database, disconnect, create/remove/modify objects (on client, another Process) and apply changes to database (much) later
* 37. Support for ASP.NET (Visually?, Out of the box).
* 38. Support for Remoting (Visually?, Out of the box). Distributed Objects.
* 39. Support for WebServices (Visually?,Out of the box).
* 40. Support for information exchange with System.Data.DataSet?.
* 41. In memory object filtering (Specifically ask for a complex filter on an ArrayList of Objects without hitting the database)
* 42. Batch Update (Update lots of objects without object creation).
* 43. Batch Delete (Delete lots of objects without object creation, for example this is very useful in Cascade Delete for ToMany? relationships).
* 44. Saving Changes with one line of code (ObjectsEngine?.CommitAllChanges?()), does all the inserts, deletes and updates in the right order, without user intervention, and without violating Master/Detail relationships.
You may have noticed that some features ask the question "Visually?", being able to visually databind your objects to the UI (and show errors with an ErrorProvider) is a very important feature for an O/R mapper in the .NET world (because, if a lot of users are going to want the ease of use of the DataSet when using your O/R Mapper in the development of WinUI (WindowsForms.NET) or WebUI (ASP.NET) applications
By the way, I would like to add your answers to this questions to the Wiki in
http://c2.com/cgi-bin/wiki?ObjectRelationalToolComparisonDotNet
To begin having a detailed comparision between ORM frameworks. Is this fine with you?
Fine with me.
Here is a breakdown on the current version of ORM.NET.
Version 2.0 will address some more of these features, and I will update when it becomes available.
Y 1. Release Version Number (To indicate which version has been refered to, Maturity)
Y 2. "Free" as in "free beer" - no license fee
Y 3. "Free" as in "free speech" - source available
N 4. Has mapping GUI (For DataBase to Objects, and Objects to Database)
N 5. .NET ErrorProviderSupport? and DataBinding? Support (without me coding ANYTHING) for WindowsForms.NET
Y 6. Does not requires manual SQL building, but can easily accept SQL based queries.
N 7. RDBMS support/independence, and the user can easily add support for other databases or persistent mechanisms (XML, Prevalence, etc).
N 8. Integration with an MVC framework (like User Interface App Block) o Metaframework (SpringFramework in Java, for example) for both ASP.NET and WindowsForms (Why we need ObjectRelationalIntegrationWithModelViewController?)
Y/N 9. Supports relationships between objects (User can choose the names and types of the foreign keys)
N 10. Mapping supports grouping (GROUP BY clause)
N 11. Mapping supports aggregate functions (count(), avg(), etc.)
N 12. Includes full support of lazy resolution of all queries
N 13. Maintains single identities for objects returned from queries (aka "uniquing") (i.e., AddressFinder?.findById(1) == AddressFinder?.findById(1));
Y 14. Resolves Circular Identities (aka "uniquing") (i.e., "account == account.getCustomer().getAccount()")
Y 15. Generates Mapping as well as the Objects themselves, so you don't duplicate information in the .NET Objects and the related mapping information.
Y/N 16. Supports Composite Primary Keys (I don't like this, but sometimes is useful for legacy applications)
N 17. Aggregate Mappings - Single field maps to multiple fields in database. http://martinfowler.com/eaaCatalog/embeddedValue.html
N 18. Supports both many to many and one to many associations
N 19. Supports collections of Strings, Integers, Dates, etc
N 20. Supports inheritance / polymorphic queries
Y 21. Supports one to one associations
N 22. Can fetch associated objects using SQL outer joins
N 23. Support for optimistic locking / versioning
N 24. Support for Unit of work / object level transactions
N 26. Providing an ODMG compliant API and/or OCL and/or OPath
Y 27. Does NOT require "extra" database tables holding locks, metadata, etc.
N 28. Supports multiservers (clustering) and simultaneous access by other applications without loss of transaction integrity
Y 29. This is a question: Requires code generation?
Y 30. This is a question: Requires RuntimeReflection??
N 31. Query Caching - Built-in support (developer writes no code). The following two identical queries will hit the database only once. The second time cached results will be returned. Address address = AddressFinder?.selectByPrimaryKey(new Long(1)); assertTrue(address == AddressFinder?.selectByPrimaryKey(new Long(1)));
N 32. Supports sequences and identity/autoincrement columns for primary key generation (Not using the incorrect SELECT MAX method!) (The user can choose the name and type of the primary key field)
? 33. Supports ternary associations
N 34. Supports mapping of one class to multiple tables ( Sometimes legacy databases leave you no choice.)
N 35. Supports mapping of multiple classes to one table
N 36. Supports persistence of properties through private fields (Not very important for me, but I am curious)
N 37. Supports persistence of properties through accessors (get/set methods or properties, and they can be private)
Y 38. Supports disconnected operations: Populate objects from database, disconnect, create/remove/modify objects (on client, another Process) and apply changes to database (much) later
N 37. Support for ASP.NET (Visually?, Out of the box).
N 38. Support for Remoting (Visually?, Out of the box). Distributed Objects.
N 39. Support for WebServices (Visually?,Out of the box).
Y 40. Support for information exchange with System.Data.DataSet?.
Y 41. In memory object filtering (Specifically ask for a complex filter on an ArrayList of Objects without hitting the database)
N 42. Batch Update (Update lots of objects without object creation).
N 43. Batch Delete (Delete lots of objects without object creation, for example this is very useful in Cascade Delete for ToMany? relationships).
Y 44. Saving Changes with one line of code (ObjectsEngine?.CommitAllChanges?()), does all the inserts, deletes and updates in the right order, without user intervention, and without violating Master/Detail relationships.