Version History



  • Fixed : TObjectManager.Replicate not working when one of the id fields of the entity being replicated is an enumeration. Ticket #22366.
  • Fixed : List item out of bounds in some cases where deleting an entity which contains a list of detail items that are also supposed to be deleted due to cascading configuration. Ticket #22156.


  • New : Delphi 12 support.


  • Improved : Support for ARM64 macOS and ARM64 iOS Simulator platforms.
  • Improved : Small memory optimization when saving blobs, Aurelius is now using less memory to save them.
  • Improved : Select projections and fetch eager information now work for many-valued associations. This allows you to improve performance when retrieving lists (many-valued associations), by selecting a subset of the properties to be returned.
  • Improved : RegularExpression attribute now accepts a parameter ValidateEmptyStrings. If True, empty strings will not be automatically considered valid and will have to pass the regular expression test.
  • Improved : Dictionary associations now provide the Alias property which contains the full prefixed association name. Useful to be used with the FetchEager method. Request #21312.
  • Fixed : Cascade was not being applied in polymorphic associations at the second deep level. For example, Parent -> Child -> SubChild. If SubChild is a class hierarchy and might have descendant classes, the cascades were not being applied for SubChild associations that were declared in descendant classes. Thanks to Dr. Holger Flick for reporting.
  • Fixed : AureliusDictionaryGenerator demo was not compiling due to using wrong dictionary generator class name. Thanks to Cesar Romero for reporting.


  • New : support for {$alias} in SQL conditions (Filter).
  • Improved : OnSQLExecuting event now allows you to change the SQL being executed, giving you low-level flexibility to fine tune the generated SQL.
  • Improved : IgnoreVersionControl protected property was being ignored. Ticket #20746.
  • Fixed : SmartGuid id generator causing duplicated ids on non-Windows platforms. Ticket #20581.
  • Fixed : Range check error when trying to import entities from database at design-time.
  • Fixed : Automatic aliasing not working when aliased properties were being used in SQL functions like Upper or Lower. Ticket #20589.


  • New : ItemRequired, ItemMinLength, ItemMaxLength validation attributes allow validate items in lists and arrays.
  • Improved : New virtual method TCustomAureliusDataset.AddFieldDefsFromRttiInfo. Ticket #20281.
  • Improved : Better error message when a mapped class member does not have RTTI info. Ticket #20318.
  • Fixed : Concurrent version control was failing when using cached updates if the same record was being modified two or more times. Ticket #20134.
  • Fixed : Calculated fields not being updated after a call to RefreshRecord. Ticket #20132.


  • New : Dynamic properties now support associations and many-valued associations.


  • Improved : PropName property is not marked as deprecated anymore. Ticket #19761.
  • Fixed : Memory leak in some rare situations while updating the database structure. Ticket #19526.
  • Fixed : Criteria.Open not working correctly for entities with selected projections.


  • New : Associations now can be used in abstract entities.
  • Improved : Design-time components were greyed out in component palette if current platform was different than Win32.


  • Fixed : Access Violation when using SubCriteria in Aurelius queries (regression). See


  • New : You can now use property projections when retrieving regular entities. This will allow you to optimize the queries by limiting the properties to be retrieved for the entities.
  • New : Automapping attribute now can receive an engine class that allows customizing automatic naming.
  • Fixed : Typo in design-time TAureliusConnection dialog.
  • Fixed : TFetchMode.Eager now forces eager loading of many-valued associations as well.


  • Improved : BREAKING CHANGE: Range and MinLength validators don't fail anymore if value is empty.


  • Improved : When an entity is deleted using Manager.Remove, its cascaded many-valued association lists are also cleared.
  • Improved : Now a custom id generator can be defined for composite ids.
  • Improved : Most database drivers now implement IDBResultSet3 interface, which provides the FieldCount method.
  • Improved : Better error messages for mapping errors, it's now informing the offending entity class.
  • Improved : Better error message when trying to use associated entities not belonging to the model.
  • Improved : Better error message when trying to use an entity with no Id attribute configured.
  • Fixed : Unique key names were being generated in Delphi 11 with different values then previous Delphi versions.
  • Fixed : Still range check errors (Integer overflow) was being raised in TAureliusDataset in some situations when the dataset had a high number of fields.
  • Fixed : MaxLength validator failing for null string values.


  • New : Auto alias mechanism allows querying by associated objects without the need to use CreateAlias.
  • New : Aurelius dictionary validator makes sure your dictionary is never out of sync with the real entity classes, ensuring that you safely write queries that won't crash at runtime.
  • New : Aurelius dictionary now can be generated in many ways: from existing databases, from existing entity classes in your application, or even from external command-line tool.
  • New : Aurelius dictionary allows you to write queries in a much easier and safe way, even with associated objects.
  • Improved : Using global filter in a descendant entity class (using an inheritance strategy) is not supported and now an exception is raised if you try to use it.
  • Fixed : Very specific error happening when a global filter was applied to an associated object, and such object is a descendant class in a joined-table hierarchy. For example, suppose you are querying for TInvoice entities. Such TInvoice entity has an association Customer of type TSpecificCustomer. Such TSpecificCustomer is part of a joined-table hierarchy and is not the root class, but a descendant one. The bug would happen if there is a global filter declared specifically in TSpecificCustomer class, and such filter is enabled. Aurelius would generate an invalid SQL statement.
  • Fixed : Integer overflow when opening TAureliusDataset with too many fields.


  • New : Delphi 11 support.


  • Fixed : Wrong data retrieved in the following corner case: a criteria loading an associated entity that is part of a joined-table inheritance, and such class has a global filter. Also, ElevateDB, NexusDB and AbsoluteDB won't support such construction. This required a significant refactor in the SQL building mechanism and changed the final generated SQL. Please pay attention to any possible issues, specially when dealing with entities in a joined-table hierarchy.
  • Fixed : TCriteria.FetchEager was incorrectly returning a TCriteria class instead of TCriteria.
  • Fixed : Issue when OnUpdating event had two subscribers. If the first subscribers modifies data, the second subscriber won't get the correct value in NewColumnValues parameter.
  • Fixed : Automapping in abstract entities was requiring Id attribute to be present. Now it's optional (Id can be defined in concrete entity classes).


  • New : TCriteria.FetchEager method allows defining a specific lazy association to be loaded eagerly in a specific query.
  • Improved : Nullable type Nullable is now in unit Bcl.Types.Nullable. Old unit Aurelius.Types.Nullable still exist but we recommend gradually moving the reference to the new unit.
  • Fixed : TAureliusDataset.BeforeScroll/AfterScroll events not firing in detail dataset when the parent record was changed.
  • Fixed : Database update failing to create non-unique indexes when the index name had spaces and other non-id characters.


  • New : Abstract entities. You can now add mapping attributes to a class tagged with the [AbstractEntity] attribute, create entities inheriting from such class and having the mapping be inherited from abstract to concrete entity.
  • Improved : Additional checks when unloading SQLite native library to avoid AV in very specific situations (units finalizing in a different order).
  • Fixed : Calling FieldDefs.Update from TAureliusDataset would cause the dataset to be open with no data, if objects were previously provided using method SetSourceCriteria, SetSourceCursor or SetSourceList (with an owned list).


  • New : TObjectManager.Validate method to force an entity validation without saving.
  • Improved : TAureliusDataset now supports TByteField (ftByte) and TLongWordField (ftLongWord).
  • Improved : Native MSSQL Driver now supports query parameters of type TBcd (FmtBCD).
  • Improved : MusicLibrary demo is now multitenant and includes examples for global filters, data validation and attributed-based events.
  • Fixed : Several methods in TMappingExplorer were incorrectly flagged as deprecated.
  • Fixed : Global filters not working with entity classes using joined tables hierarchy.
  • Fixed : Execution of batch statements causing Access Violation when Assertions compiler option was set to off.
  • Fixed : Error message "Filter definition not found" when enabling a global filter before the mapping explorer was used for the first time.
  • Fixed : AutoComplyOnInsert option in global filters not working, sometimes, when used in an entity class with single table inheritance.
  • Fixed : Access Violation when enabling filters in managers using the default mapping explorer.


  • New : TObjectManager.AddOwnership method makes sure Aurelius object manager will always destroy the passed object, no matter if the persistence operations.
  • New : TMappingSetup.ModelName property allows automatically loading entities from a different model when using mapping setups.
  • New : TAureliusDataset now can optionally own the source list, destroying it when it closes. Now the SetSourceList method of Aurelius dataset can receive an optional boolean parameter that, if true, will cause the list to be automatically destroyed when the dataset is closed. You won't have to worry about destroying the list in this case.
  • New : TAureliusDataset methods RefreshRecord and FillRecord. It's useful when you have modified the object properties directly and want the dataset to reflect such changes.
  • New : It's now possible to handle events directly from the entity class, using event-handling attributes. This way you can organize better your business logic letting the entity class itself handle many of logic when persistence events happen.
  • New : Global filters mechanism allows applying query filters to all entities at once. Among other things, it's a very handy feature for single-database multitenant applications.
  • New : Filter enforcer mechanism uses global filter definitions to make sure any data modification complies with the active filter. In multitenant applications, for example, it ensures that no data is saved, updated or deleted if the record belongs to a tenant different than the one specified by the current tenantId parameter.
  • New : Entity-level validation via OnValidate attribute. Add the OnValidate to any method of your entity class that you want to be called before an entity validation.
  • New : Data validation system provides a way to add validation rules to entities that make sure your entities will be always persisted in a valid state. Now you can add rules via attributes, create custom validation, and more.
  • Improved : More performance improvements.
  • Improved : ILIKE operator now working on all databases (using UPPER when the database doesn't natively support ILIKE syntax).
  • Fixed : Memory leak when an EPropertyNotFound exception was raised from using a wrong CreateAlias call in Aurelius criteria. For example, in code Find.CreateAlias('WrongPropertyName', 'p'), an expected exception will be raise because WrongPropertyName property doesn't exist. However, this was causing a memory leak.
  • Fixed : Internal method TMappingExplorer.GetAssociations causing Access Violation when the passed class was not an Aurelius entity (regression).
  • Fixed : INSERT statement was being generated with a wrong field name when such name needed special treatment due to not being a valid identifier.
  • Fixed : Access Violation when MappedBy parameter of a ManyValuedAssociation attribute referenced an invalid class member.


  • Improved : The way to use internal classes TInsertCommand and TUpdateCommand has been modified.
  • Improved : Support for Boolean fields in ElevateDB databases.
  • Improved : Overall performance increase, with Aurelius now being up twice faster, specially in insert and update operations.
  • Improved : Better handling of transactions when using UIB components. Now UIB driver automatically opens a transaction to perform SQL statements, if no transaction is active.
  • Improved : AnyDAC support is deprecated. AnyDAC was the predecessor of FireDAC, and we considered it doesn't make sense anymore to keep supporting it.
  • Fixed : TAureliusDataset now returns correct value when reading OldValue property of dataset fields.
  • Fixed : Direct Oracle Access driver now works fine with Unicode memo fields (NCLOB).
  • Fixed : Access Violation (instead of a better error message) when the Id mapping attribute makes a reference to a class member that doesn't exist.
  • Fixed : AbsoluteDB boolean literal regression. Value projections of type boolean, like "Linq.Value(False)" was broken.


  • Fixed : Regression bug - wrong behavior when the MappedBy parameter of a ManyValuedAssociation attribute references an association which is part of the id of the associated class. For example, in the declaration [ManyValuedAssociation([], [], 'FParent')], the FParent is part of the Id of TChild class. Fixed in 4.17.2, regression introduced in 4.17.


  • New : TRecordCountMode.FetchAll option in TAureliusDataset. Allows you to force dataset to load (fetch) all records to retrieve the correct value for RecordCount property.
  • Improved : Several internal classes were refactored, bringing an average 10-20% performance increase in database operations (retrieve and update data).


  • Improved : Native SQL Server driver (MSSQL) performance increase when executing data modification statements.
  • Improved : Internal changes allows updating of entities that have mapping fields/properties to database fields with special names (like "name[0]").
  • Fixed : Native MSSQL driver saving null even when the parameter was an empty string.
  • Fixed : Native MSSQL driver error "Cannot insert explicit value for identity column in table when IDENTITY_INSERT is set to OFF" even after an SQL statement was executed to set IDENTITY_INSERT to ON.
  • Fixed : "Invalid referenced column name defined in join column" error in a very specific situation. Conditions: a) bidirectional association using a non-id column as reference. b) The non-id column is declared after the many-valued association field in parent class.
  • v4.15

    • Fixed : Batch updates using SQLite native driver was not updating field values when parameter was null.


    • New : TObjectManager.CachedCount property. Provides information about how many actions are cached to be applied when ApplyUpdates is called.
    • New : Support for Delphi 10.4 Sydney.
    • New : Batch Updates mechanism allows inserting, updating or deleting an arbitrary number of database records using a single SQL statement, improving peformance in such cases. TObjectManager now introduces a BatchSize property, which is used in conjunction with cached updates mechanism. When BatchSize is greater than 1, several similar cached actions are merged together in a single SQL statement, improving performance by reducing communication with the database.


    • Fixed : Sporadic Assert failure in MSSQL native driver.


    • New : Cached updates mechanism in TObjectManager. You can now defer all SQL statements executed in the database by setting TObjectManager.CachedUpdates to true. In this mode, you can call manager methods like Save, Flush, Remove to manipulate objects, and the database will not be hit until you call TObjectManager.ApplyUpdates.
    • New : "Cached Updates" demo shows how to use new feature cached udpdates feature.
    • Improved : Avoided some Access Violations in Object Manager when the entities contained associate lists with nil entities in the list. This was not considered a bug because it's up to the developer to make sure there are no nil entities in lists. The behavior is unpredictable if this happens and those nil pointers should be avoided. But now the code will at least not raise Access Violations.
    • Fixed : When retrieving entities having associations that are restricted by Where attribute, the entity was not being retrieved if the association didn't exist in database. For example, suppose an entity TInvoice with an associated TCustomer entity. Such TCustomer entity has a Where attribute restricting its usage. When retrieving a TInvoice entity, if the associated customer in the database was null, the TInvoice object will not be returned, instead the result will be nil (as if the invoice didn't exist in the database).
    • Fixed : SQL boolean literal in MSSQL dialect wrong when UseBoolean is true.
    • Fixed : Regression with saving widememo data using FireDAC. Error was introduced in 4.11. Current error now is like [FireDAC][Phys][ODBC]-345. Data too large for variable [A_KOMUNIKAT]. Max len = [4000], actual len = [23608] Hint: set the TFDParam.Size to a greater value.
    • Fixed : Memory leak when an exception was raised while loading properties of an entity.
    • Fixed : Adding/removing records in the detail dataset was not flagging the master record (parent) as modified.


    • Fixed : Rare Invalid Pointer in Win64 platform when using TAureliusDataset.
    • Fixed : Native MSSQL native driver raising an error "Invalid precision value" when updating a Memo/WideMemo with null/empty string value.
    • Fixed : Native MSSQL driver causing "Function Sequence Error" in some situations (when an IDBConnection interface is only released at the end of the application).
    • Fixed : Legacy serializer/deserializer (DataSnap) raising error when serializing proxied associations with composite keys.
    • Fixed : Importing Firebird database schema fails when the database have indexes only with "computed by" columns.
    • Fixed : Error "-19. Data type conversion is not supported" when saving Unicode blobs using FireDac in MySQL databases.


    • New : Support for Android 64-bit platform (Delphi 10.3.3 Rio).
    • Fixed : Using Literal projection with date time values in some databases (like SQL Server) failed in Finish systems and any other language that set the time separator to a character different than ":".
    • Fixed : Still an extra fix for the AV/Invalid Pointer Operation issue described in version 4.9.
    • Fixed : Setting TAureliusDataset.RecNo had no effect in some situations (not correctly changing the current record).


    • New : "Driver" parameter in MSSQL native driver allows to explicitly define which driver to use to connect. By default the most recent installed driver is automatically used, but this feaure is useful for testing purposes, or if you have a specific technical reason to use a specific driver, or an older version.
    • Improved : In TAureliusDataset import field definition dialog you can now order the list of available by unit name. Just click the column name in the list view and the list will be ordered, either by unit name or class name.
    • Fixed : Sporadic Access Violation or Invalid Pointer Operation when using object manager to retrieve entities that inherit from TInterfacedObject or any other class that implement interface reference counting. The error was more likely to happen when compiling for Win64 platforms. This issue was introduced in TMS Aurelius 4.5. If you are using any version from 4.5 until 4.8 and if your have any Aurelius entity that inherits from TInterfacedObject (or any other class that implement automatic reference counting), it's strongly recommended that you update to 4.9 version or above.


    • New : Where attribute allows custom filtering when retrieving entities and many-valued associations. You can now add a Where attribute to an entity class that provides an additional SQL expression to be added to the WHERE clause of SELECT statement used to retrieve the entities. One use case for this is soft delete: you can add an SQL clause like "{Deleted} = 'T", for example. This will prevent such entities to be retrieved if the Deleted field in the database is "T". The Where attribute can also be used in a many-valued association to filter records retrieved in the list. You could have, for example, two TAddress lists, one for valid addresses and another for invalid ones, properly filtering those using the Where attribute.
    • New : TAureliusModelEvents component for setting mapping events using a RAD approach. Using events in Aurelius is now easier by using TAureliusModelEvents component. Simply drop it in a form and set the desired event handler(s) using the object inspector. It's as simple as that.
    • New : TAureliusManager component for persisting objects using a RAD approach. TAureliusManager component allows an even easier way to persist Aurelius entities. It encapsulates TObjectManager in a RAD way: just drop the component in the form, associate with a TAureliusConnection component and you are ready to go.
    • New : TAureliusDataset.ReadOnly property. You can set ReadOnly property of TAureliusDataset to true to easily put the dataset in read-only mode with a single line. This prevent data for being edited in data-aware controls.
    • New : TAureliusDBSchema component for updating database schema using a RAD approach. It's now easier than ever to create or update your database structure (tables and fields). Just drop a TAureliusDBSchema component in the form, associate it with a TAureliusConnection component and use one of this methods, like UpdateDatabase. It automatically instantiates and encapsulates the TDatabaseManager class that creates and validates database structure.
    • Improved : Design-time field loader form now persists its size and position. When using TAureliusDataset at design-time you can right-click and choose "Load field definitions..." to open a dialog form that allows you to choose a BPL package and load fields from entities. If you position or resize that dialog form, its size and position will be persisted: if you close and reopen the dialog at later time, last size and position will be restored.
    • Fixed : SQL error when mapping fields to expressions like field arrays "fieldname[index]". For example, you can now map to Postgres array fields, using a mapping like "[Column('fieldname[1]', [])]".


    • Fixed : SQL error in some situations when using Take or Skip criteria methods in Oracle databases.


    • Fixed : TAureliusDataset.RecNo property not properly working with filtered dataset.
    • Fixed : TAureliusDataset displaying incorrect data when dataset is filtered and some data modification is performed (like record insert or delete).
    • Fixed : Error when inserting entities belonging to a joined-table inheritance hierarchy, when the Id in the ancestor class was declared with TColumnProp.NoInsert.


    • Fixed : TAureliusDataset.RecNo property not properly working with filtered dataset.
    • Fixed : Error when inserting entities part of a joined-table inheritance, when the Id in the ancestor class was declared with TColumnProp.NoInsert.


    • New : TSQLGenerator.UseBoolean is now avaiable for all SQL dialects.
    • Fixed : Unexpected wrong behavior with boolean (BIT) fields using native Aurelius MSSQL driver.
    • Fixed : Nullable.Create overloaded constructor which received an initial value was still keeping the nullable with HasValue flag set to True.
    • Fixed : Error "cannot find datatype Computed (Identity)" when generating entities from Delphi Rio IDE.


    • New : TGlobalConfigs.GetInstance.UseTransactionsInDBManager property provides a global way to control the UseTransactions property in TDatabaseManager.
    • New : TDatabaseManager.UseTransactions property allows automatically start/commit of transactions when executing DDL statements.
    • New : Support for SAP SQL Anywhere database - former Sybase SQL Anywhere, Adaptative SQL Anywhere (ASA)
    • New : Support for NativeDB components (adapter for TASASession).
    • Improved : OldColumnValues in OnUpdating/OnUpdated events now includes column values for proxies even when they were not yet loaded.
    • Fixed : Workaround a bug in Delphi Rio causing error in deserialization using TDataSnapJsonDeserializer.
    • Fixed : TAureliusConnection and UniDac adapter causing "one of the connections in the transaction is not active" error.
    • Fixed : It's now possible to have two Aurelius entity class with same name in the same model (e.g, TCity in Unit1 and TCity in Unit2).
    • Fixed : Entity generator raising an error when trying to extract schema information from PostgreSQL 11.
    • Fixed : Entity generator not working with "INTERBASE" dialect.


    • Fixed : TAureliusConnection failing to create a cloned connection for ElevateDB connections.
    • Fixed : Entity generation from databases using TAureliusConnection failing on MySQL 8 with error "table 'mysql.proc' doesnt exist".


    • New : Support for Delphi 10.3 Rio.
    • Improved : AllButRemove is default option for association cascade type when generating entities from database.
    • Fixed : TDatabaseManager.ValidateDatabase reporting wrong data type for wide memo fields in DB2.
    • Fixed : DBIndexes not being created together when a new table was created.


    • Fixed : Error when importing Firebird3 boolean fields even using FIREBIRD3 dialect, when using TAureliusConnection "Generate database entities" design-time option.


    • New : TObjectManager.HasChanges allows checking if an specific or all objects in manager have been modified.
    • New : MSSQL driver LoginTimeout parameter.
    • Improved : TCriteriaResult objects are now editable from the TAureliusDataset.
    • Improved : TAureliusDataset.ForceWideTypes forces dataset to create wide string types (widestring, widememo, widefixedchar) for text-based fields.
    • Improved : TAureliusConnection design-time settings dialog now responds to Enter and Esc keys.
    • Improved : Better error message when trying to use unsupported field/property types in mapped classes.
    • Fixed : TAureliusDataset now creates memo/widememo fields when the TBlob property is flagged with DBTypeMemo/DBTypeWideMemo attributes (previously it was blob).
    • Fixed : Rare Int64 convert error when importing entities from a MySQL database using a LONGBLOB data type.
    • Fixed : JwtAuthDemo memory leak when canceling the insertion of a new record.
    • Fixed : Entity generator now adds DBTypeWideMemo for field types in database that are explicit unicode memo fields (NText, NVarchar(max), etc.).
    • Fixed : Blob fields not marked as "loaded" when read from AureliusDataset, causing a single lazy blob to be retrieved multiple times when navigating through the dataset.
    • Fixed : Better handling of memo fields in TAureliusDataset - TBlob unicode memo raw data is now converted to ANSI data if field type is ftMemo.


    • New : TAureliusConnection component. It provides design-time configuration and test of database connection.
    • New : Native database drivers for direct database connection. Native Microsoft SQL Server connection (TMSSQLConnection) is now supported.
    • New : Generate TMS Aurelius entities from existing database directly from the IDE.
    • Improved : Dropped Delphi 2010 and XE support. TMS Aurelius and BCL now supports Delphi XE2 and up.
    • Improved : Aurelius connection wizard updated to allow choosing the new native drivers.
    • Fixed : Icon in IDE splash screen not appearing.


    • Fixed : TAureliusDataset memory leak when a source (criteria, cursor) is specified but the dataset is never open


    • New : TObjectManager.DeferDestruction property. Such property prevents immediate destruction of entities removed with Remove method, deferring their destruction to the moment when object manager is destroyed.
    • New : TAureliusDataset.FieldInclusions property. This provides more control on what types of fields will be automatically created by Aurelius Dataset. You can choose not to automatically create lists (dataset fields) or objects (entity fields), for example.
    • Improved : TCriteria FindByAlias and FindByPath methods allows finding TSubCriteria objects created using CreateAlias or SubCriteria methods.
    • Improved : Proxy type now sets internal proxied value to nil when DestroyValue is called.
    • Improved : Aurelius DBConnection Wizard using FireDAC now adds FireDac.DApt unit automatically to uses clause.
    • Fixed : Entity classes in a single-table hierarchy without DiscriminatorColumn attribute was causing errors when loading entities. Now such classes are being ignored by Aurelius.
    • Fixed : DiscriminatorColumn now has default size of 0 (instead of 30) when DiscriminatorType is dtInteger.
    • Fixed : DiscriminatorColumn attribute now ignores size parameter (when updating database schema) if discriminator type is not string.
    • Fixed : Associations/proxies not loading correctly for inherited classes in a single-table hierarchy.


    • New : Proxy.Key property.
    • Improved : Significant performance improvement in entity retrieval. Up to 50% of speed gain in some operations, most noticeable when selecting (finding) a high number of entities with high number of properties and associations
    • Improved : SQL Server dialect option: WorkaroundInsertTriggers.
    • Improved : PostgreSQL generator now supports both Sequence (already supported) and Identity (serial) identifiers.
    • Improved : IDBConnectionAdapter interface allows to get the underlying adapted database-access component (TFDConnection, for example).
    • Fixed : ManyValuedAssociation attribute documentation was wrongly explaining the option TCascadeType.Lazy
    • Fixed : Access Violation in TAureliusDataset when setting property DatasetField at design-time


    • New : TCriteria.Find.Open now can be iterated using
    • New : LINQ SqlFunction and ISQLGenerator.RegisterFunction allows creating custom SQL functions to be used in LINQ.
    • New : ILike operator in LINQ. You can now also use ILike operator in Linq expressions.
    • Improved : TCriteria.Open now returns ICriteriaCursor instead of TCriteriaCursor. This is a minor breaking change.
    • Improved : TAureliusDataset is not "Sequenced" anymore when RecordCount mode is set to Retrieve.
    • Improved : TAbstractSQLGenerator.EnforceAliasMaxLength allows avoiding issues when field names in database are at the maximum size and might cause "field not found" errors when executing LINQ queries.
    • Improved : No more UPDATE SQL statements executed when inserting child (many-valued association) items.
    • Improved : More detailed info when exception EAssociationReferencesTransientObject is raised ("Association references a transient object").
    • Fixed : Aurelius Dataset fields not notifying visual controls when subproperties were being automatically updated due to SyncSubprops behavior.


    • New : TAureliusDataset.RecordCountMode property.
    • Improved : Significant performance increase when retrieving entities from database.
    • Fixed : TCriteria.Refreshing state was lost when TCriteria was cloned.
    • Fixed : SQLite driver refactored to use static library on Android due to Android 7 Nougat error: "unauthorized access to "".
    • Fixed : Design-time wizard icon not showing correctly in Delphi 10.2 Tokyo.


    • New : TObjectManager.FindCached and IsCached methods.
    • New : TCriteria.Refreshing method.
    • New : TAureliusDataset.SyncSubprops property allows automatic update of associated fields.
    • New : TAureliusDataset.SubpropsDepth property allows automatic loading of subproperty fields.
    • New : TAureliusDataset.DefaultsFromObject property brings field default values with object state.
    • New : TAureliusDataset popup menu option at design-time for quick reloading field definitions.
    • New : DBIndex attribute.
    • Improved : When targeting DB2 databases, TDatabaseManager now retrieves schema of database objects and updates/creates them accordingly.
    • Improved : Updating ElevateDB database schema (TDatabaseManager.UpdateDatabase) is significantly faster now.
    • Improved : TAureliusDataset doesn't automatically call Flush anymore on Insert and Delete operations, when Manager property is set.
    • Improved : Faster lazy-loading of proxied associations in some situations.
    • Fixed : Firedac + Oracle on Delphi Tokyo was causing "Data Too Large" error on fixed-sized parameters.
    • Fixed : Calling TAureliusDataset.RecordCount on a closed dataset was raising an Access Violation.
    • Fixed : Calling TAureliusDataset.Delete was raising an exception in some specific situations.
    • Fixed : Argument out of range on specific Merge operations.


    • Fixed : Using AureliusDataset, during an insert, if a Post operation failed, an Access Violation would be raised if user cancels insertion of record.
    • Fixed : Access Violation when loading a lazy blob in the handler of OnDeleted event


    • New : Linux platform support together with Rad Studio 10.2 Tokyo support
    • Fixed : TGlobalConfigs.GetInstance.SimuleStatements not working
    • Fixed : Memory leaks in mobile platforms
    • Fixed : Error when loading entities with inheritance where a lazy blob field is declared in an inherited class.
    • Fixed : Better transactions handling on UIB (Universal Interbase) driver


    • New : Manager events OnInserting, OnUpdating, OnDeleting.
    • Improved : Not equal (<>) operator support in Linq queries
    • Fixed : JSON Deserializer failed when deserializing nullable enumerated values
    • Fixed : Firebird schema update was trying to generate sequences even though they already existed in database (regression)
    • Fixed : Error inserting records in SQL Server when table name ends with "Values"
    • Fixed : DB2 dialect was not supporting schemas (regression)


    • New : MSSQL dialect UseBoolean property allows using BIT data type for boolean fields in SQL Server
    • New : Firebird3 dialect support
    • Improved : Demos rewritten to better show use more recent Aurelius features
    • Improved : Column names can now be mapped using double quotes
    • Improved : Better error handling when SQLite DLL is not available
    • Fixed : Wrong behavior and cast errors in TAureliusDataset when moving dbgrid field columns linked to the dataset
    • Fixed : Memory leaks on nextgen (mobile) platforms when using FireDac (version 3.4.1)
    • Fixed : IBExpress adapter not working if using the overloaded Create constructor that receives a TComponent parameter
    • Fixed : Error with field names containing spaces.
    • Fixed : Cast error in Aurelius Dataset when setting a nullable enumerated field to null
    • Fixed : Aurelius Dataset Locate method accepts variant array as search value even when locating for a single field


    • Fixed : Memory leaks on nextgen (mobile) platforms when using FireDac


    • New : TDatabaseManager.IgnoreConstraintName property for better control of database schema update and validation
    • New : Linq query syntax improved with support for relational operators: Linq['Name'] = 'Mia'. All query examples in this documentation updated to newer syntax.
    • New : Linq functions Contains, StartsWith, EndsWidth now support projections: Linq['Name'].StartsWith(Linq['OtherField'])
    • New : Linq "type-helper" version all existing functions, like Upper or Year: (Linq['Name'].Upper = 'MIA') and (Linq['CreatedAt'].Year = 2015)
    • New : In clause in Linq queries
    • New : Cross-database Concat function: Linq.Concat(Linq['FirstName'], Linq['LastName'])
    • New : Arithmetic projections Add, Subtract, Multiply and Divide, also supporting operators: Linq['Total'] + Linq['Additional']
    • Fixed : ZeosLib depending on unnecessary units


    • New : TObjectManager.Flush method can now receive an entity as parameter allowing flushing a single entity.
    • New : TCascadeType.Flush cascade type allows control of how associated objects will be flushed when flushing a single entity
    • New : Support for ZeosLib database-access components
    • Improved : When retrieving Int64 values from database, it now tries to handle the value even when the underlying db access component provides the value as float
    • Fixed : When using bidirectional associations, in some rare situations the many-to-one side of association was being cleared
    • Fixed : TAureliusDataset.RecNo returning wrong value when in insert mode
    • Fixed : TAureliusDataset displaying wrong records when using Filter in a detail dataset (DatasetField pointing to another dataset)


    • New : TManagerEvents.OnSQLExecuting event that is fired for every SQL statement executed in database
    • New : TCriteria.Clone method allows cloning an existing Aurelius criteria
    • New : TAureliusDataset.IncludeUnmappedObjects property to allow object and list fields even if they are not mapped in class
    • Improved : Online Resources updated with links for new videos and articles
    • Improved : Mapping table and field names with spaces is now allowed, without needing to quote the names in quotes in mapping
    • Fixed : TProjections.Count failed for counting GUID fields
    • Fixed : TDateTime field values losing time part when using dbGO and ODBC driver
    • Fixed : Inheritance using discriminator failed in some situations with SQLite due to int32/int64 type mismatch
    • Fixed : DB Connection Wizard failed when using AnyDac connection
    • Fixed : Breaking change: Updating/Merging objects with proxied associations that were not modified was not clearing the value
    • Fixed : Breaking change: Merging transient objects with proxy collections was ignoring the collection content. TObjectManager.MergeListLegacyBehavior
    • Fixed : "Duplicate Field Name" error in Aurelius Dataset when loaded object had properties that have been redeclared from an ancestor class


    • New : Explorer.ObjectFactory and Manager.ObjectFactory properties allows defing a custom object factory for creating entity classes.
    • New : Delphi 10.1 Berlin support
    • Fixed : Database update using table schema now working with PostgreSQL and MS SQL Server


    • New : TObjectManager.Replicate method
    • New : Design-time wizard "New TMS Aurelius Connection" makes it very straightforward to create Aurelius database connections (IDBConnection)
    • Improved : TObjectManager.Find has a new overload that accepts TGuid value for id
    • Improved : TDatabaseManager can receive a TArray, allowing to create the database structure for all of them at once
    • Improved : Saving an object with user-assigned id was calling SQL to retrieve ID without need
    • Improved : Automapping now sets generator to SmartGuid if field FId is of type TGuid
    • Fixed : Wrong error message (AV) when opening a cursor and SQL dialect is not registered
    • Fixed : Sporadic AV when destroying TAureliusDataset without closing it
    • Fixed : Merging an object with a lazy-loaded list wouldn't delete removed items on Flush if the object being merged was not loaded from TObjectManager
    • Fixed : After Mapping Explorer raised an error about wrong mapping when retrieving columns for a class, it could later not raise that error anymore


    • New : TObjectManager.UseTransactions property allows control whether manager uses transactions to perform internal operations. This is a breaking change.
    • New : Optimistic versioned concurrency control of entities using Version attribute
    • Improved : More detailed error message when loading a proxy fails due to duplicated records.


    • New : Delphi 10 Seattle support


    • New : OnInserted event parameters now include Master that hold the parent instance in case of unidirectional items being inserted
    • New : Cross-database, high-level projection functions in Aurelius queries. Date/time functions added: Year, Month, Day, Hour, Minute, Second. String functions added: Upper, Lower, Substring, Position, Length, ByteLength.
    • New : Additional TLinq conditions for string comparison: Contains, StartsWith, EndsWith.


    • Fixed : AV when using Update event listener for objects in manager without previous state (using Update method)


    • New : Events system allows subscribing listeners to respond to several events (e.g, when an entity is inserted, updated, etc.)
    • Improved : When deserializing objects from JSON, properties unknown to the entity will now be ignored, instead of raising an error.
    • Improved : Music Library demo includes an audit log viewer that illustrates usage of the events system.
    • Fixed : FireDAC driver not compiling on XE8


    • New : Support for Delphi XE8


    • Improved : TBlob.Data property removed. Breaking change
    • Improved : TBlob handling of data (especially using AsBytes property) improved for better performance
    • Fixed : TAureliusDataset now retrieves correct value for RecordCount when dataset is filtered
    • Fixed : Setting a lazy TBlob content that was not yet loaded didn't change blob content
    • Fixed : Rare Access Violation when reloading associated object lists that exist in object manager
    • Fixed : Flush not updating properties modified if lazy proxy/blob is loaded after properties were modified


    • Improved : TAureliusDataset makes it easy to reload fields from classes at design-time by remembering the last class used to load fields
    • Improved : TAureliusDataset design-time dialog now makes it much easier to find a class by providing a search box
    • Fixed : TObjectManager.Merge was not updating collections when none of parent object properties was changed
    • Fixed : Rare error when inserting records in MS SQL Server, using SQL-Direct and native SQL Server client
    • Fixed : Error when inserting records with identity Id on tables with INSERT triggers in MS SQL Server
    • Fixed : Access Violation when destroying entity objects before destroying a TAureliusDataset component
    • Fixed : AV when loading a proxy value after an object refresh


    • New : TObjectManager.Evict method allows removing an object instance from the manager without destroying it
    • New : TFetchMode option in CreateAlias allows per-query setting for eager-loading associations to improve performance
    • New : TCriteria.OrderBy provides an easier, alternative way to TCriteria.AddOrder to specify criteria order
    • New : TAureliusDataset.ParentManager allows fine-grained control over the manager used in detail datasets
    • New : TAureliusDataset.Current now returns an object even in insert state
    • Improved : Removed an extra final SQL being executed in paged queries using TAureliusDataset
    • Improved : Automatic destruction of TCriteriaResult objects in TAureliusDataset when using SetSourceCriteria or SetSourceCursor
    • Fixed : TAureliusDataset.BookmarkValid was wrongly returning true after the bookmarked record was deleted
    • Fixed : Saving child objects using unidirectional ManyValuedAssociation when parent has composite key
    • Fixed : Json serialization using SuperObject was providing wrong boolean value
    • Fixed : Design-time error using TAureliusDataset when recompiling packages with entities
    • Fixed : Blobs and associations being loaded in lazy mode were causing objects to be updated on flush


    • New : SmartGuid generator allows using identifiers with sequential GUID for better database performance
    • New : RegisterEntity procedure helps registering a mapped class avoiding linker optimization to remove it from application
    • New : Proxy.Available property
    • New : OrderBy attribute allows defining a default order for many-valued associations
    • New : Multi-model design architecture allows different mapping models in a single application with a few lines of code, just by using attributes
    • New : Model attribute to specify the model where the class belongs to
    • Improved : Wrong data for fields OldValue property when dataset is empty
    • Improved : Trailing semi-comma from some PostgreSQL commands were causing errors when using FireDac with automatic record count
    • Improved : More detailed manager error messages when trying to save objects that are already persistent
    • Improved : Incompatibility between TAureliusDataset and FastReport design-time editor
    • Improved : Identity conflict when using MS SQL Server with multiple simultaneous sessions inserting in the same table


    • New : Added Delphi XE7 support


    • New : TObjectManager.Refresh method allows refreshing object state from database
    • New : TFirebirdSQLGenerator.WideStringCharSet property allows defining specific column character set for WideString properties in Firebird
    • New : TDriverConnectionAdapter.Connection property allows referencing the original database component used for the connection
    • New : TCustomJsonDeserializer.Entities property allows retrieving the list of objects created by the JSON deserializer
    • New : TCascadeType.RemoveOrphans allow automatic deletion/removal of child entities on Flush if they are removed from a parent collection
    • New : TBlob.Available property
    • New : ForeignKey attribute to define the name of foreign keys in the database
    • Improved : Merge now can receive objects with no id. This will automatically create a copy of the object and save it. This is a breaking change.
    • Improved : Better performance and memory consumption using unidirectional datasets to fetch data with some specific component adapters
    • Fixed : Error when updating objects with composite id in SQLite and one of id values is null
    • Fixed : Error when serializing a newly created entity (not loaded with manager) with a TBlob property that has not been initialized
    • Fixed : Error when deserializing empty dynamic array properties
    • Fixed : ElevateDB driver compile error when using latest ElevateDB versions


    • New : Delphi XE6 Support
    • Improved : MappedClasses.RegisterClass now checks if the class being registered is a valid entity ([Entity] attribute present)
    • Improved : CascadeTypeAllButRemove constant makes easier to define association cascade with all options except TCascadeType.Remove
    • Fixed : Wrong TAureliusDataset behavior with db visual controls that rely on CompareBookmarks method
    • Fixed : Using [Automapping] attribute with classes that inherit from non-entity classes was causing "Id attribute not found" error


    • New : Support for FireDac components
    • New : Support for Android platform
    • New : Property TIBObjectsConnectionAdapter.Transaction allows you to change the default transaction in an IBObjects connection adapter
    • New : Overloaded constructor for connection component adapters allows easier memory management when using data modules
    • Fixed : TAureliusDataset.Current method was returning an invalid value when it was in insert state.
    • Fixed : TAureliusDataset missing the current record position in some situations
    • Fixed : Memory leak when trying to save unmapped objects.
    • Fixed : "Duplicates not allowed" when retrieving objects in a inheritance tree where different descendant classes had associations with same name


    • New : TCriteria.AutoDestroy property allows keeping TCriteria in memory after objects are retrieved
    • New : RAD Studio XE5 support
    • New : Increased querying capabilities with newTExpression/TLinq methods that allow comparing a projection to any other projection
    • New : Connection driver for XData RemoteDB
    • Fixed : Wrong default values when inserting a record in XE4 with TAureliusDataset
    • Fixed : IBObjects driver now correctly performing statements using IB_Session object specified in the TIBODatabase
    • Fixed : Exception not being raised when calling TClassHierarchyExplorer.GetAllSubClasses
    • Fixed : Error when deserializing a Json array representing an existing object list, when class member was a proxy


    • New : RAD Studio XE4 support
    • New : Full iOS support, including native access to SQLite database
    • Fixed : Wrong example in documentation about lazy-loading associations in distributed applications (proxy loader)
    • Fixed : Schema validation example code in manual
    • Fixed : Not possible to create unique keys referencing columns declared using ForeignJoinColumn attributes
    • Fixed : Merge cascades not being applied correctly
    • Fixed : Error using transactions with IBExpress, IBObjects and DirectOracleAccess components
    • Fixed : Access violation when loading package multiple times in TAureliusDataset design-time editor


    • New : Update Database Schema feature (TDatabaseManager.UpdateDatabase method)
    • New : TSQLiteNativeConnectionAdapter.EnableForeignKeys and DisableForeignKeys methods allow control when foreign keys are enforced in SQLite connections
    • New : TMappingSetup.MappedClasses property allows defining different class entities for different setups
    • New : TDatabaseManager.SQLExecutionEnabled property allows generating scripts to update/create/drop database schema without effectively execute statements
    • New : Detailed Database Schema analysis when updating/validating/creating
    • New : Database Schema validation feature (TDatabaseManager.ValidateDatabase method)
    • Improved : TGlobalConfig.AutoSearchMappedClasses property removed
    • Fixed : Conversion error in TAureliusDataset entity fields when using live bindings


    • New : Support for Unified Interbase (UIB) components
    • Improved : Statements to generate MS SQL Server database structure now explicitly declare NULL constraint when creating fields
    • Improved : Specific conversion issue when retrieving TGuid value from UNIQUEIDENTIFIER fields, using SQL-Direct with server type set to stSQLServer
    • Improved : Retrieving objects (Find) with null id in database now raises an exception instead of just returning a nil instance.
    • Improved : Exception when setting TAureliusDataset.Filtered := true when dataset is active
    • Improved : Error when flushing objects with many-valued-association declared before id fields and which foreign key field had same name as id field
    • Improved : Cascade not being applied when flushing objects with single-valued associations pointing to unmanaged (transient) instances
    • Improved : Auto mapping now automatically includes TColumnProp.NoUpdate in ID column properties
    • Fixed : Uses clause in Direct Oracle Access driver included a wrong unit name
    • Fixed : Error when deserializing Nullable types using JSON deserializer


    • New : Support for Direct Oracle Access components
    • Improved : Updated source code to work correctly when recompiling with Assertions off
    • Fixed : Rare memory leak when using some specific compiler settings (Optimizations=On)
    • Fixed : Memory leak in "Getting Started" demo
    • Fixed : Error using TAureliusDataset.Locate with nullable string fields when there were null fields in dataset


    • New : Full JSON support makes it easy to build distributed applications
    • New : Enumeration field as string now possible in TAureliusDataset by using field name suffix ".EnumName"
    • Improved : TGlobalConfigs.AutoMappingDefaultCascade now split in two different properties for Association and ManyValuedAssociation (breaking change)
    • Improved : IdEq method in TLinq
    • Fixed : TGuid properties and fields were causing occasional errors in Flush method calls


    • New : TCriteria.RemovingDuplicatedEntities allows removing duplicated objects from result list
    • New : Support for FIBPlus components
    • New : Properties Count and PropNames in TCriteriaResult object provides additional info about retrieved projections
    • New : Delphi/C++Builder XE3 support
    • Improved : Possibility to use descendants of TList/TObjectList for many-valued associations
    • Improved : Non-generic TObjectManager.Find method overload accepting a class type as parameter
    • Improved : Better support for other date types (string and julian) in SQLite database
    • Fixed : Memory leak when creating a default TMappingExplorer
    • Fixed : Error when saving collection items belonging to a joined-tables class hierarchy
    • Fixed : Cascade removal was not removing lazy-loaded associations if the associations were not loaded


    • New : TExpression.Sql and TProjections.Sql methods for adding custom SQL syntax to a query, increasing flexibility in query construction
    • New : Support for properties/fields of type TGuid, which are now mapped to database Guid/Uniqueidentifier fields (if supported by database)
    • New : Support for Absolute Database
    • New : Guid, Uuid38, Uuid36 and Uuid32 identifier generators allow client-side automatic generation of GUID and/or string identifiers


    • New : Dynamic properties allows mapping to database columns at runtime connection
    • Improved : TCriteriaResult objects supported in TAureliusDataset
    • Improved : TCriteriaResult object can retrieved projected values by projection alias
    • Improved : TAureliusDataset.Post method now saves object if it's not persisted, even in edit mode
    • Improved : Better validation of MappedBy parameter in ManyValuedAssociation attribute
    • Fixed : Manual Quick Start example updated with correct code
    • Fixed : Issue with association as part of composite id when multiple associations are used in cascaded objects
    • Fixed : Automapping was not correctly defining table name in some situations with inherited classes


    • New : TCriteria.Open method allows returning a cursor for fetching objects on demand
    • New : TBlob.LoadFromStream and SaveToStream methods for improved blob manipulation
    • New : TAureliusDataset.InternalList property allows access to the internal object list
    • New : Support for ElevateDB database server
    • New : Paging query results now supported by using new TCriteria methods Skip and Take
    • New : Paged fetch-on-demand using TAureliusDataset.SetSourceCriteria allows fetching TDataset records on demand without keeping an open database connection
    • New : Fetch-on-demand support on TAureliusDataset, by using SetSourceCursor method
    • New : "Not" operator supported in TLinq expressions and "Not_" method in TExpression
    • Improved : TObjectManager.Find method introduced as an alias for CreateCriteria method for query creation
    • Improved : TCriteria.UniqueResult returns the unique object even if the object is returned in more than one row (duplicated rows of same object)
    • Improved : TCriteria.UniqueResult now returns nil if no objects are returned
    • Improved : NexusDB through UniDac components now supported


    • New : Support for UniDac components
    • New : Fully documented TAureliusDataset component for visual binding objects to data-aware controls
    • Improved : IBObjects adapter now can adapt any TIB_Connection component, not only TIBODatabase ones
    • Improved : Better exception messages for convert error when load entity property values from database
    • Improved : Better error handling with more detailed and typed exceptions being raised at key points, especially value conversion routines
    • Fixed : Memory leak in MusicLibrary demo
    • Fixed : Issue with lazy-loaded proxies using non-id columns as foreign keys
    • Fixed : Issue with SQL statement when using more than 26 eager-loading associations
    • Fixed : Issue when selecting objects with non-required associations and required sub-associations
    • Fixed : Automapping in a subclass in a single-table hierarchy caused issues when creating database schema
    • Fixed : Adding Automapping attribute was not requiring Entity attribute to be declared


    • New : TObjectDataset preview (for registered users only)
    • New : Support for IBObjects components
    • Improved : MusicLibrary demo refactored to use best-designed controllers
    • Improved : Access Violation replaced by descriptive error message when SQL dialect was not found for connection
    • Fixed : Registered version installer sometimes not correctly detecting XE/XE2 installation
    • Fixed : Memory leak is some specific situations with automapped associations
    • Fixed : Memory leak in MusicLibrary demo
    • Fixed : Issue with automapping self-referenced associations
    • Fixed : Default value of OwnsObjects property in TObjectManager changed from false to true (as stated by documentation)
    • Fixed : Component adapter was ignoring explicitly specified SQL dialect
    • Pricing

      Single Developer License Small Team License Site License

      TMS Aurelius

      € 190

      60 yearly renewal
      license for 1 developer

      check  Full source code
      check  Access to the TMS Support Center
      check  Free updates and new releases

      TMS BIZ Premium

      € 595

      180 yearly renewal
      license for 1 developer

      check  Full source code
      check  Access to the TMS Support Center
      check  Free updates and new releases
      check  TMS Aurelius
      check  All TMS BIZ products
      more_horiz  Discover more


      € 1,795

      575 yearly renewal
      license for 1 developer

      check  Full source code
      check  Access to the TMS Support Center
      check  Free updates and new releases
      check  TMS Aurelius
      check  All TMS BIZ products
      check  All TMS products
      more_horiz  Discover more
      All prices excl. VAT. Renewal price is subject to change and only valid up to 30 days after license has expired. After renewal period a discount price is offered to renew the license.


      Get unlimited access to all TMS products
      One money and time saving bundle

      Free Trial

      Start a free TMS Aurelius evaluation today!
      RAD Studio

      What our customers say

      I am very happy to use TMS Aurelius with Delphi 10.4, I did not expect a quick launch like this. I am also enjoying the new BatchSize feature, which is much faster than the normal mode.

      - Leandro

      From what I've seen so far, I think this is going to revolutionize my app development - can't wait to start playing with the features now!

      - Dave White

      It's now very easy to build a report with the new Flexcel + Aurelius integration. It was so easy that I really thought I was doing something wrong. I will never go back to a report generator, Flexcel is way cooler and easier for reports.

      - Eduardo Elias

      TMS Aurelius makes my code to be very clean. I can code in pure OOP, not worrying about database persistence or SQL statements, being able to switch connections and database servers very easily. My development speed has increased significantly.

      - Carlos Fitl

      Wagner, I must congratulate with you: I really enjoy reading and watching your posts and videos about TMS Aurelius. First, I appreciate them because they are very specific and up to the point. Second, as a TMS Aurelius user, the more of your post I read, the more I am confident about the choice I have made between TMS Aurelius and "The Others". I love the simplicity of TMS Aurelius: this is the very distinctive trait of it: If you know how to deal with Plain Old Simple Object in Delphi, then you know 80% of TMS Aurelius. And your posts about it, are something I always find very interesting. Thank you so much.

      - Fabio Vitale

      TMS WEB Core

      Create modern web apps in Delphi & VSC
      Use Object Pascal code to build JavaScript apps