What's New in TMS Aurelius
Version 5.18 (January-2024)
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.
Fixed: TObjectManager.Replicate not working when one of the id fields of the entity being replicated is an enumeration. Ticket #22366.
Version 5.17 (November-2023)
- New: Support for Delphi 12.
Version 5.16 (October-2023)
Improved: Support for ARM64 macOS and ARM64 iOS Simulator platforms.
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: Dictionary associations now provide the
Alias
property which contains the full prefixed association name. Useful to be used with the FetchEager method. Request #21312.Improved: Small memory optimization when saving blobs, Aurelius is now using less memory to save them.
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.
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.
Version 5.15 (July-2023)
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: Automatic aliasing not working when aliased properties were being used in SQL functions like
Upper
orLower
. Ticket #20589.Fixed: Range check error when trying to import entities from database at design-time.
Version 5.14 (February-2023)
New: ItemRequired, ItemMinLength, ItemMaxLength validation attributes allow validate items in lists and arrays.
Improved: Better error message when a mapped class member does not have RTTI info. Ticket #20318.
Improved: New virtual method
TCustomAureliusDataset.AddFieldDefsFromRttiInfo
. Ticket #20281.Fixed: Calculated fields not being updated after a call to
RefreshRecord
. Ticket #20132.Fixed: Concurrent version control was failing when using cached updates if the same record was being modified two or more times. Ticket #20134.
Version 5.13 (January-2023)
- New: Dynamic properties now support associations and many-valued associations.
Version 5.12 (December-2022)
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.
Version 5.11 (September-2022)
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.
Version 5.10 (August-2022)
- Fixed: Access Violation when using SubCriteria in Aurelius queries (regression). See https://support.tmssoftware.com/t/exception-with-latest-version/18897
Version 5.9 (July-2022)
- 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.
Estimates := Manager.Find<TEstimate>
.Select(TProjections.ProjectionList
.Add(Linq['EstimateNo'])
.Add(Linq['Customer'])
.Add(Linq['Customer.Name'])
.Add(Linq['Customer.Sex'])
.Add(Linq['Customer.Country'])
.Add(Linq['Customer.Country.Id'])
)
.FetchEager('Customer')
.FetchEager('Customer.Country')
.List
New: Automapping attribute now can receive an engine class that allows customizing automatic naming.
Fixed: TFetchMode.Eager now forces eager loading of many-valued associations as well.
Fixed: Typo in design-time
TAureliusConnection
dialog.
Version 5.8 (March-2022)
Version 5.7 (February-2022)
Improved: Now a custom id generator can be defined for composite ids.
Improved: When an entity is deleted using Manager.Remove, its cascaded many-valued association lists are also cleared.
Improved: Better error message when trying to use an entity with no Id attribute configured.
Improved: Most database drivers now implement
IDBResultSet3
interface, which provides theFieldCount
method.Improved: Better error message when trying to use associated entities not belonging to the model.
Improved: Better error messages for mapping errors, it's now informing the offending entity class.
Fixed:
MaxLength
validator failing for null string values.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.Breaking change:
TEvent<T>
type moved to unitBcl.Types
.
Version 5.6 (October-2021)
- New: Aurelius dictionary allows you to write queries in a much easier and safe way, even with associated objects:
Manager.Find<TInvoice>
.Select(Dic.Invoice.Total.Sum)
.Where(Dic.Invoice.Customer.Country.Name = 'Brazil')
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 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: Auto alias mechanism allows querying by associated objects without the need to use
CreateAlias
:
Manager.Find<TEstimate>
.Where(Linq['Customer.Country.Name'] = 'United States')
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: Integer overflow when opening TAureliusDataset with too many fields.
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. SuchTInvoice
entity has an associationCustomer
of typeTSpecificCustomer
. SuchTSpecificCustomer
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 inTSpecificCustomer
class, and such filter is enabled. Aurelius would generate an invalid SQL statement.
Version 5.5 (September-2021)
- New: Delphi 11 support.
Version 5.4 (July-2021)
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: Automapping in abstract entities was requiring Id attribute to be present. Now it's optional (Id can be defined in concrete entity classes).
Fixed:
TCriteria<E>.FetchEager
was incorrectly returning aTCriteria
class instead ofTCriteria<E>
.Fixed: Issue when
OnUpdating
event had two subscribers. If the first subscribers modifies data, the second subscriber won't get the correct value inNewColumnValues
parameter.
Version 5.3 (Jun-2021)
New: TCriteria.FetchEager method allows defining a specific lazy association to be loaded eagerly in a specific query.
Improved: Nullable type
Nullable<T>
is now in unitBcl.Types.Nullable
. Old unitAurelius.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.
Version 5.2 (Apr-2021)
- 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.
[AbstractEntity, Automapping]
TBaseEntity = class
strict private
FCreatedAt: TDateTime;
FUpdatedAt: Nullable<TDateTime>;
public
property CreatedAt: TDateTime read FCreatedAt write FCreatedAt;
property UpdatedAt: Nullable<TDateTime> read FUpdatedAt write FUpdatedAt;
end;
[Entity, Automapping]
TCustomer = class(TBaseEntity)
{...}
end;
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
fromTAureliusDataset
would cause the dataset to be open with no data, if objects were previously provided using methodSetSourceCriteria
,SetSourceCursor
orSetSourceList
(with an owned list).
Version 5.1 (Mar-2021)
New: TObjectManager.Validate method to force an entity validation without saving.
Improved: MusicLibrary demo is now multitenant and includes examples for global filters, data validation and attributed-based events.
Improved: Native MSSQL Driver now supports query parameters of type
TBcd
(FmtBCD
).Improved:
TAureliusDataset
now supportsTByteField
(ftByte
) andTLongWordField
(ftLongWord
).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: Access Violation when enabling filters in managers using the default mapping explorer.
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: Several methods in
TMappingExplorer
were incorrectly flagged as deprecated.
Version 5.0 (Mar-2021)
- 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:
[Entity, Automapping]
TCustomer = class
strict private
FId: Integer;
[Required, MaxLength(20)]
FName: string;
[EmailAddress]
FEmail: string;
[DisplayName('class rate')]
[Range(1, 10, 'Values must be %1:d up to %2:d for field %0:s')]
FRate: Integer;
- 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.
[FilterDef('Multitenant', '{TenantId} = :tenantId')]
[FilterDefParam('Multitenant', 'tenantId', TypeInfo(string))]
[Filter('Multitenant')]
TProduct = class
{...}
Manager.EnableFilter('Multitenant')
.SetParam('tenantId', 'microsoft');
Products := Manager.Find<TProduct>.OrderBy('Name').List;
- 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.
type
{$RTTI EXPLICIT METHODS([vcPrivate..vcPublished])}
TCustomer = class
strict private
[OnInserting] procedure OnInserting(Args: TInsertingArgs);
[OnInserted] procedure OnInserted;
[OnUpdated, OnInserted] procedure AfterModification;
{...}
end;
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 theOnValidate
to any method of your entity class that you want to be called before an entity validation:
TCustomer = class
[OnValidate]
function CheckBirthday: IValidationResult;
[OnValidate]
function CheckName(Context: IValidationContext): IValidationResult;
- New: TObjectManager.AddOwnership method makes sure Aurelius object manager will always destroy the passed object, no matter if the persistence operations
Customer := TCustomer.Create;
Manager.AddOwnership(Customer);
Manager.Save(Customer);
// no need to destroy Customer
// even if Save fails
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: 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: TMappingSetup.ModelName property allows automatically loading entities from a different model when using mapping setups.
Improved: More performance improvements.
Improved:
ILIKE
operator now working on all databases (usingUPPER
when the database doesn't natively supportILIKE
syntax).Fixed: Access Violation when
MappedBy
parameter of a ManyValuedAssociation attribute referenced an invalid class member.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: Memory leak when an
EPropertyNotFound
exception was raised from using a wrongCreateAlias
call in Aurelius criteria. For example, in codeFind<TMyObject>.CreateAlias('WrongPropertyName', 'p')
, an expected exception will be raise becauseWrongPropertyName
property doesn't exist. However, this was causing a memory leak.
Version 4.18 (Sep-2020)
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.
Improved: Support for Boolean fields in ElevateDB databases.
Breaking change: The way to use internal classes TInsertCommand and TUpdateCommand has been modified.
Fixed: TAureliusDataset now returns correct value when reading OldValue property of dataset fields.
Fixed: AbsoluteDB boolean literal regression. Value projections of type boolean, like "Linq.Value<Boolean>(False)" was broken.
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: Direct Oracle Access driver now works fine with Unicode memo fields (NCLOB).
Version 4.17 (Aug-2020)
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).
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.
Version 4.16 (Jun-2020)
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 <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.
Version 4.15 (Jun-2020)
- Fixed: Batch updates using SQLite native driver was not updating field values when parameter was null.
Version 4.14 (May-2020)
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.
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.
Version 4.13 (Apr-2020)
- Fixed: Sporadic Assert failure in MSSQL native driver.
Version 4.12 (Apr-2020)
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: Adding/removing records in the detail dataset was not flagging the master record (parent) as modified.
Fixed: SQL boolean literal in MSSQL dialect wrong when UseBoolean is true.
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: 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.
Version 4.11 (Mar-2020)
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: Native MSSQL native driver raising an error "Invalid precision value" when updating a Memo/WideMemo with null/empty string value.
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.
Fixed: Rare Invalid Pointer in Win64 platform when using TAureliusDataset.
Fixed: Legacy serializer/deserializer (DataSnap) raising error when serializing proxied associations with composite keys.
Version 4.10 (Nov-2019)
New: Support for Android 64-bit platform (Delphi 10.3.3 Rio).
Fixed: Setting TAureliusDataset.RecNo had no effect in some situations (not correctly changing the current record).
Fixed: Still an extra fix for the AV/Invalid Pointer Operation issue described in version 4.9.
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 ":".
Version 4.9 (Oct-2019)
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.
Version 4.8 (Sep-2019)
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: 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.
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: 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: 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.
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]', [])]".
Version 4.7 (Jun-2019)
New (4.7.1.1 July-2019): macOS 64 support in Delphi Rio 10.3.2.
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 (4.7.1): SQL error in some situations when using Take or Skip criteria methods in Oracle databases.
Version 4.6 (May-2019)
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.
Version 4.5 (Mar-2019)
New: TSQLGenerator.UseBoolean is now avaiable for all SQL dialects.
Fixed: Unexpected wrong behavior with boolean (BIT) fields using native Aurelius MSSQL driver.
Fixed: Error "cannot find datatype Computed (Identity)" when generating entities from Delphi Rio IDE.
Fixed: Nullable.Create overloaded constructor which received an initial value was still keeping the nullable with HasValue flag set to True.
Version 4.4 (Jan-2019)
New: Support for SAP SQL Anywhere database - former Sybase SQL Anywhere, Adaptative SQL Anywhere (ASA).
New: Support for NativeDB components (adapter for TASASession).
New: TDatabaseManager.UseTransactions property allows automatically start/commit of transactions when executing DDL statements.
New: TGlobalConfigs.GetInstance.UseTransactionsInDBManager property provides a global way to control the UseTransactions property in TDatabaseManager.
Improved: OldColumnValues in OnUpdating/OnUpdated events now includes column values for proxies even when they were not yet loaded.
Fixed: Entity generator not working with "INTERBASE" dialect.
Fixed: Entity generator raising an error when trying to extract schema information from PostgreSQL 11.
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).
Version 4.3 (Dec-2018)
Fixed: Entity generation from databases using TAureliusConnection failing on MySQL 8 with error "table 'mysql.proc' doesnt exist".
Fixed: TAureliusConnection failing to create a cloned connection for ElevateDB connections.
Version 4.2 (Nov-2018)
New: Support for Delphi 10.3 Rio.
Improved: AllButRemove is default option for association cascade type when generating entities from database.
Fixed: DBIndexes not being created together when a new table was created.
Fixed: TDatabaseManager.ValidateDatabase reporting wrong data type for wide memo fields in DB2.
Version 4.1 (Oct-2018)
New: TObjectManager.HasChanges allows checking if an specific or all objects in manager have been modified.
Improved: TAureliusDataset.ForceWideTypes forces dataset to create wide string types (widestring, widememo, widefixedchar) for text-based fields.
Improved: TCriteriaResult objects are now editable from the TAureliusDataset.
Improved: Better error message when trying to use unsupported field/property types in mapped classes.
Improved: TAureliusConnection design-time settings dialog now responds to Enter and Esc keys.
Fixed: Better handling of memo fields in TAureliusDataset - TBlob unicode memo raw data is now converted to ANSI data if field type is ftMemo.
Fixed: TAureliusDataset now creates memo/widememo fields when the TBlob property is flagged with DBTypeMemo/DBTypeWideMemo attributes (previously it was blob).
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: 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 (4.1.1): Error when importing Firebird3 boolean fields even using FIREBIRD3 dialect, when using TAureliusConnection "Generate database entities" design-time option.
Version 4.0 (Sep-2018)
New: TAureliusConnection component. This component makes it even easier to connect to a database using TMS Aurelius. It provides design-time configuration and test of database connection, using a connection dialog to visually configure the parameters. Besides supporting the existing component adapters, it also supports the new database native drivers.
New: Native database drivers for direct database connection. Native Microsoft SQL Server connection (TMSSQLConnection) is now supported in addition to the existing SQLite driver (with a new TSQLiteConnection). You can now connect directly to SQL Server without the need for a 3rd party component (FireDAC, dbExpress, ADO, etc.), with increased performance (at least 20% from initial tests).
Conn := TMSSQLConnection.Create(
'Server=.\SQLEXPRESS;Database=Northwnd;TrustedConnection=True');
New: Generate TMS Aurelius entities from existing database directly from the IDE. Thanks to the new TAureliusConnection component, it's now possible to import an existing database structure and generate source code with TMS Aurelius classes mapped to the existing database, with a few clicks.
Improved: Aurelius connection wizard updated to allow choosing the new native drivers.
Improved: Dropped Delphi 2010 and XE support. TMS Aurelius and BCL now supports Delphi XE2 and up.
Fixed: Icon in IDE splash screen not appearing.
Version 3.13 (Jul-2018)
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.
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.
Improved: Aurelius DBConnection Wizard using FireDAC now adds FireDac.DApt unit automatically to uses clause.
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.
Fixed: DiscriminatorColumn attribute now ignores size parameter (when updating database schema) if discriminator type is not string.
Fixed: DiscriminatorColumn now has default size of 0 (instead of 30) when DiscriminatorType is dtInteger.
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: Associations/proxies not loading correctly for inherited classes in a single-table hierarchy.
Fixed: TAureliusDataset memory leak when a source (criteria, cursor) is specified but the dataset is never open (3.13.1)
Version 3.12 (May-2018)
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.
New: Proxy<T>.Key property. Allows you to get the database value of foreign key without needing to load the proxy object.
Improved: PostgreSQL generator now supports both Sequence (already supported) and Identity (serial) identifiers. If the Sequence attribute is not defined in the mapping, then it will try to retrieve the id generated by the database (if any).
Improved: SQL Server dialect option: WorkaroundInsertTriggers.
Improved: IDBConnectionAdapter interface allows to get the underlying adapted database-access component (TFDConnection, for example).
Fixed: Access Violation in TAureliusDataset when setting property DatasetField at design-time.
Fixed: ManyValuedAssociation attribute documentation was wrongly explaining the option TCascadeType.Lazy.
Version 3.11 (Feb-2018)
- New: LINQ SqlFunction and ISQLGenerator.RegisterFunction allows creating custom SQL functions to be used in LINQ. It's possible to use any database-specific SQL function when using Aurelius LINQ. For example, you could register UNACCENT function from PostgreSQL and use it from Criteria API:
TSQLGeneratorRegister.GetInstance.GetGenerator('POSTGRESQL')
.RegisterFunction('unaccent', TSimpleSQLFunction.Create('unaccent'));
.Where(Linq.ILike(
Linq.SqlFunction('unaccent', nil, Linq['Name']),
Linq.SqlFunction('unaccent', nil, Linq.Value<string>(SomeValue))
))
- New: ILike operator in LINQ. You can now also use ILike operator in Linq expressions. It will of course only work on databases that support it:
.Where(Linq['Sex'].IsNotNull and Linq['Name'].ILike('M%')
- New: TCriteria.Find<T>.Open now can be iterated. ICriteriaCursor now implements GetEnumerator which allows you to iterate easily through the returned entities of a criteria this way:
for Customer in Manager.Find<TCustomer>
.Where(Linq['City'] = 'London').Open do
{ use Customer object here }
Improved: More detailed info when exception EAssociationReferencesTransientObject is raised ("Association references a transient object"), indicating now the context: the name of the association property that caused the issue, the id of the object, etc.
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. This was more frequent with Firebird databases.
(TSQLGeneratorRegister.GetInstance.GetGenerator('Firebird') as TAbstractSQLGenerator)
.EnforceAliasMaxLength := True;
Improved: No more UPDATE SQL statements executed when inserting child (many-valued association) items. When inserting an object tree with many-valued associations items (Parent + Child Items), Aurelius was executing INSERT SQL statements for Parent record and for child records, and then after that UPDATE SQL statements were being executed to update the foreign-key field from child to parent table. Now this is optimized and the UPDATE SQL statements are not executed anymore, as the INSERT statements already set the foreign-key of child records.
Improved: TCriteria<T>.Open now returns ICriteriaCursor<T> instead of TCriteriaCursor<T>. This is a minor breaking change.
Improved: TAureliusDataset is not "Sequenced" anymore when RecordCount mode is set to Retrieve. This means that a data control like a grid will show the correct scrollbars (size and position relative to total of records) even when using fetch-on-demand mode and not all entities were retrieved.
Fixed: Aurelius Dataset fields not notifying visual controls when subproperties were being automatically updated due to SyncSubprops behavior.
Version 3.10 (Oct-2017)
Improved: Significant performance increase when retrieving entities from database. The specific scenario is when an entity being retrieved from database is already in the manager. Speed gains are more noticeable when lots of associated entities are retrieved in eager mode and have same id, and when cached entities have many mapped properties.
New: TAureliusDataset.RecordCountMode property. When using dataset in paged mode, you can ask dataset to perform an extra statement in the database to grab the total number of records in advance and return it in RecordCount property, even before all pages are fetched.
Fixed: SQLite driver refactored to use static library on Android due to Android 7 Nougat error: "unauthorized access to "libsqlite.so".
Fixed: Design-time wizard icon not showing correctly in Delphi 10.2 Tokyo.
Fixed: TCriteria.Refreshing state was lost when TCriteria was cloned.
Version 3.9 (Jul-2017)
New: TCriteria.Refreshing method. Using Refreshing method when creating an Aurelius query will force entities returned by the query to be refreshed even if they are already cached in Object Manager.
New: DBIndex attribute. In addition to unique indexes, you can now specify non-unique index (for optimization purposes) with this attribute and Aurelius will create it automatically upon database schema update.
New: TAureliusDataset.SyncSubprops property allows automatic update of associated fields. When an entity field (e.g., "Customer") of the TAureliusDataset component is modified, all the subproperty fields (e.g., "Customer.Name", "Customer.Birthday") will be automatically updated with new values if this property is set to True.
New: TAureliusDataset.SubpropsDepth property allows automatic loading of subproperty fields. When loading field definitions for TAureliusDataset at design-time, or when opening the TAureliusDataset without persistent fields, one TField for each property in object will be created. By increasing SubpropsDepth to 1 or more, TAureliusDataset will also automatically include subproperty fields for each property in each association, up to the level indicated by SubpropsDepth.
New: TAureliusDataset.DefaultsFromObject property brings field default values with object state. When inserting a new record in TAureliusDataset, all fields come with null values by default. By setting this property to True, default (initial) value of the fields will come from the property values of the underlying object.
New: TObjectManager.FindCached and IsCached methods. Those methods allow checking if an object of specified class and id is present in the object manager cache, without hitting the database to load the object.
New: TAureliusDataset popup menu option at design-time for quick reloading field definitions. At design-time, if you right-click TAureliusDataset component, a new menu "Reload from <class>" appear for quickly reloading the field definitions for a previously loaded class.
Improved: Faster lazy-loading of proxied associations in some situations. When the association has a JoinColumn attribute with a explicity param value for ReferencedColumnName, the manager was always hitting the database to load associated proxy. Now if the referenced column is an id column, the manager will first check if associated object is already in cache.
Improved: TAureliusDataset doesn't automatically call Flush anymore on Insert and Delete operations, when Manager property is set. Only Save and Remove methods are called, respectively. This fixes performance and unexpected behaviors in some scenarios, but might break existing code. It's a breaking change.
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.
Fixed: Calling TAureliusDataset.Delete was raising an exception in some specific situations.
Fixed: Argument out of range on specific Merge operations. This error was happening when merging an object A with a proxied list of B objects. If the B objects happen to have a reference back to A, then another instance of A would be loaded, the proxied list would be loaded, and such list would override the list of original object A being merged, causing this error.
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.
Previous Versions
Version 3.8 (May-2017)
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.
Version 3.7 (Mar-2017)
New: Linux platform support together with Rad Studio 10.2 Tokyo support.
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: TGlobalConfigs.GetInstance.SimuleStatements not working.
Fixed: Better transactions handling on UIB (Universal Interbase) driver.
Version 3.6 (Feb-2017)
New: Manager events OnInserting, OnUpdating, OnDeleting.
Improved: Not equal (<>) operator support in Linq queries.
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: JSON Deserializer failed when deserializing nullable enumerated values.
Fixed: DB2 dialect was not supporting schemas (regression).
Version 3.5 (Jan-2017)
New: Firebird3 dialect support.
New: MSSQL dialect UseBoolean property allows using BIT data type for boolean fields in SQL Server.
Improved: Column names can now be mapped using double quotes.
Improved: Demos rewritten to better show use more recent Aurelius features.
Improved: Better error handling when SQLite DLL is not available.
Fixed: Error with field names containing spaces.
Fixed: Wrong behavior and cast errors in TAureliusDataset when moving dbgrid field columns linked to the dataset.
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: IBExpress adapter not working if using the overloaded Create constructor that receives a TComponent parameter.
Fixed: Memory leaks on nextgen (mobile) platforms when using FireDac (version 3.4.1)
Version 3.4 (Sep-2016)
New: Linq query syntax improved with support for relational operators: Linq['Name'] = 'Mia'. All query examples in this documentation updated to newer syntax.
New: Arithmetic projections Add, Subtract, Multiply and Divide, also supporting operators: Linq['Total'] + Linq['Additional'].
New: In clause in Linq queries.
New: Linq "type-helper" version all existing functions, like Upper or Year: (Linq['Name'].Upper = 'MIA') and (Linq['CreatedAt'].Year = 2015).
New: Cross-database Concat function: Linq.Concat(Linq['FirstName'], Linq['LastName']).
New: Linq functions Contains, StartsWith, EndsWidth now support projections: Linq['Name'].StartsWith(Linq['OtherField']).
New: TDatabaseManager.IgnoreConstraintName property for better control of database schema update and validation.
Fixed: ZeosLib depending on unnecessary units.
Version 3.3 (Aug-2016)
New: TObjectManager.Flush method can now receive an entity as parameter allowing flushing a single entity.
New: Support for ZeosLib database-access components.
New: TCascadeType.Flush cascade type allows control of how associated objects will be flushed when flushing a single entity.
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: TAureliusDataset.RecNo returning wrong value when in insert mode.
Fixed: When using bidirectional associations, in some rare situations the many-to-one side of association was being cleared.
Fixed: TAureliusDataset displaying wrong records when using Filter in a detail dataset (DatasetField pointing to another dataset).
Version 3.2 (Jul-2016)
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.
New: TManagerEvents.OnSQLExecuting event that is fired for every SQL statement executed in database.
Improved: Mapping table and field names with spaces is now allowed, without needing to quote the names in quotes in mapping.
Improved: Online Resources updated with links for new videos and articles.
Fixed: Breaking change: Merging transient objects with proxy collections was ignoring the collection content. TObjectManager.MergeListLegacyBehavior.
Fixed: Breaking change: Updating/Merging objects with proxied associations that were not modified was not clearing the value.
Fixed: "Duplicate Field Name" error in Aurelius Dataset when loaded object had properties that have been redeclared from an ancestor class.
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: TProjections.Count failed for counting GUID fields.
Fixed: TDateTime field values losing time part when using dbGO and ODBC driver.
Version 3.1 (May-2016)
New: Delphi 10.1 Berlin support.
New: Explorer.ObjectFactory and Manager.ObjectFactory properties allows defing a custom object factory for creating entity classes.
Fixed: Database update using table schema now working with PostgreSQL and MS SQL Server.
Version 3.0 (Feb-2016)
New: Design-time wizard "New TMS Aurelius Connection" makes it very straightforward to create Aurelius database connections (IDBConnection).
New: TObjectManager.Replicate method.
Improved: Automapping now sets generator to SmartGuid if field FId is of type TGuid.
Improved: TObjectManager.Find has a new overload that accepts TGuid value for id.
Improved: Saving an object with user-assigned id was calling SQL to retrieve ID without need.
Improved: TDatabaseManager can receive a TArray<TMappingExplorer>, allowing to create the database structure for all of them at once.
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.
Fixed: Wrong error message (AV) when opening a cursor and SQL dialect is not registered.
Fixed: Sporadic AV when destroying TAureliusDataset without closing it.
Version 2.9 (Oct-2015)
New: Optimistic versioned concurrency control of entities using Version attribute.
New: TObjectManager.UseTransactions property allows control whether manager uses transactions to perform internal operations. This is a breaking change.
Improved: More detailed error message when loading a proxy fails due to duplicated records.
Version 2.8.1 (Sep-2015)
- New: Delphi 10 Seattle support.
Version 2.8 (Aug-2015)
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.
New: OnInserted event parameters now include Master that hold the parent instance in case of unidirectional items being inserted.
Version 2.7.1 (May-2015)
- Fixed: AV when using Update event listener for objects in manager without previous state (using Update method).
Version 2.7 (Apr-2015)
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.
Version 2.6.3 (Apr-2015)
- New: Delphi XE8 support.
Version 2.6.2 (Mar-2015)
Improved: TBlob handling of data (especially using AsBytes property) improved for better performance.
Improved: TBlob.Data property removed. Breaking change.
Fixed: Flush not updating properties modified if lazy proxy/blob is loaded after properties were modified.
Fixed: Setting a lazy TBlob content that was not yet loaded didn't change blob content.
Fixed: TAureliusDataset now retrieves correct value for RecordCount when dataset is filtered.
Fixed: Rare Access Violation when reloading associated object lists that exist in object manager.
Version 2.6.1 (Feb-2015)
Improved: TAureliusDataset design-time dialog now makes it much easier to find a class by providing a search box.
Improved: TAureliusDataset makes it easy to reload fields from classes at design-time by remembering the last class used to load fields.
Fixed: TObjectManager.Merge was not updating collections when none of parent object properties was changed.
Fixed: AV when loading a proxy value after an object refresh.
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: Rare error when inserting records in MS SQL Server, using SQL-Direct and native SQL Server client.
Version 2.6 (Dec-2014)
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: TAureliusDataset.Current now returns an object even in insert state.
New: TAureliusDataset.ParentManager allows fine-grained control over the manager used in detail datasets.
New: TCriteria.OrderBy provides an easier, alternative way to TCriteria.AddOrder to specify criteria order.
Improved: Automatic destruction of TCriteriaResult objects in TAureliusDataset when using SetSourceCriteria or SetSourceCursor.
Improved: Removed an extra final SQL being executed in paged queries using TAureliusDataset.
Fixed: Design-time error using TAureliusDataset when recompiling packages with entities.
Fixed: TAureliusDataset.BookmarkValid was wrongly returning true after the bookmarked record was deleted.
Fixed: Blobs and associations being loaded in lazy mode were causing objects to be updated on flush.
Fixed: Json serialization using SuperObject was providing wrong boolean value.
Fixed: Saving child objects using unidirectional ManyValuedAssociation when parent has composite key.
Version 2.5 (Oct-2014)
New: Multi-model design architecture allows different mapping models in a single application with a few lines of code, just by using attributes.
New: SmartGuid generator allows using identifiers with sequential GUID for better database performance.
New: OrderBy attribute allows defining a default order for many-valued associations.
New: Model attribute to specify the model where the class belongs to.
New: RegisterEntity procedure helps registering a mapped class avoiding linker optimization to remove it from application.
New: Proxy<T>.Available property.
Improved: More detailed manager error messages when trying to save objects that are already persistent.
Fixed: Identity conflict when using MS SQL Server with multiple simultaneous sessions inserting in the same table.
Fixed: Trailing semi-comma from some PostgreSQL commands were causing errors when using FireDac with automatic record count.
Fixed: Wrong data for fields OldValue property when dataset is empty.
Fixed: Incompatibility between TAureliusDataset and FastReport design-time editor.
Version 2.4.1 (Sep-2014)
- New: Delphi XE7 support.
Version 2.4 (Jul-2014)
New: TObjectManager.Refresh method allows refreshing object state from database.
New: ForeignKey attribute to define the name of foreign keys in the database.
New: TCascadeType.RemoveOrphans allow automatic deletion/removal of child entities on Flush if they are removed from a parent collection.
New: TCustomJsonDeserializer.Entities property allows retrieving the list of objects created by the JSON deserializer.
New: TDriverConnectionAdapter<T>.Connection property allows referencing the original database component used for the connection.
New: TBlob.Available property.
New: TFirebirdSQLGenerator.WideStringCharSet property allows defining specific column character set for WideString properties in Firebird.
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: ElevateDB driver compile error when using latest ElevateDB versions.
Fixed: Error when deserializing empty dynamic array properties.
Version 2.3.1 (Apr-2014)
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: Using [Automapping] attribute with classes that inherit from non-entity classes was causing "Id attribute not found" error.
Fixed: Wrong TAureliusDataset behavior with db visual controls that rely on CompareBookmarks method.
Version 2.3 (Feb-2014)
New: Support for Android platform.
New: Support for FireDac components.
New: Overloaded constructor for connection component adapters allows easier memory management when using data modules.
Improved: Property TIBObjectsConnectionAdapter.Transaction allows you to change the default transaction in an IBObjects connection adapter.
Fixed: TAureliusDataset.Current method was returning an invalid value when it was in insert state.
Fixed: "Duplicates not allowed" when retrieving objects in a inheritance tree where different descendant classes had associations with same name.
Fixed: TAureliusDataset missing the current record position in some situations.
Fixed: Memory leak when trying to save unmapped objects.
Version 2.2 (Oct-2013)
New: Increased querying capabilities with new TExpression/TLinq methods that allow comparing a projection to any other projection (in addition to comparing to values only).
New: Support for Rad Studio XE5.
New: Connection driver for XData RemoteDB.
New: TCriteria.AutoDestroy property allows keeping TCriteria in memory after objects are retrieved.
Changed: Packages structure. See breaking changes.
Fixed: Error when deserializing a Json array representing an existing object list, when class member was a proxy.
Fixed: Exception not being raised when calling TClassHierarchyExplorer.GetAllSubClasses.
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.
Version 2.1 (May-2013)
New: Full iOS support, including native access to SQLite database.
New: Support for Rad Studio XE4.
Fixed: Not possible to create unique keys referencing columns declared using ForeignJoinColumn attributes.
Fixed: Merge cascades not being applied correctly.
Fixed: Access violation when loading package multiple times in TAureliusDataset design-time editor.
Fixed: Wrong example in documentation about lazy-loading associations in distributed applications (proxy loader).
Fixed: Schema validation example code in manual.
Fixed: Error using transactions with IBExpress, IBObjects and DirectOracleAccess components.
Changed: Live bindings disabled by default.
Version 2.0 (Apr-2013)
New: Update Database Schema feature (TDatabaseManager.UpdateDatabase method).
New: Database Schema validation feature (TDatabaseManager.ValidateDatabase method).
New: Detailed Database Schema analysis when updating/validating/creating (TDatabaseManager properties: Actions, Warnings, Errors).
New: TMappingSetup.MappedClasses property allows defining different class entities for different setups (and thus databases/connections).
New: TDatabaseManager.SQLExecutionEnabled property allows generating scripts to update/create/drop database schema without effectively execute statements.
New: TSQLiteNativeConnectionAdapter.EnableForeignKeys and DisableForeignKeys methods allow control when foreign keys are enforced in SQLite connections.
Improved: TGlobalConfig.AutoSearchMappedClasses property removed.
Fixed: Conversion error in TAureliusDataset entity fields when using live bindings.
Version 1.9 (Feb-2013)
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: Auto mapping now automatically includes TColumnProp.NoUpdate in ID column properties.
Improved: Retrieving objects (Find) with null id in database now raises an exception instead of just returning a nil instance.
Fixed: Error when flushing objects with many-valued-association declared before id fields and which foreign key field had same name as id field.
Fixed: Cascade not being applied when flushing objects with single-valued associations pointing to unmanaged (transient) instances.
Fixed: Exception when setting TAureliusDataset.Filtered := true when dataset is active.
Fixed: Specific conversion issue when retrieving TGuid value from UNIQUEIDENTIFIER fields, using SQL-Direct with server type set to stSQLServer.
Fixed: Error when deserializing Nullable<double> types using JSON deserializer.
Fixed: Uses clause in Direct Oracle Access driver included a wrong unit name.
Version 1.8 (Jan-2013)
New: Support for Direct Oracle Access components.
Improved: Updated source code to work correctly When recompiling with Assertions off.
Fixed: Error using TAureliusDataset.Locate with nullable string fields when there were null fields in dataset.
Fixed: Rare memory leak when using some specific compiler settings (Optimizations=On).
Fixed: Memory leak in "Getting Started" demo.
Version 1.7 (Dec-2012)
New: Full JSON support makes it easy to build distributed applications.
New: Enumeration field as string now possible in TAureliusDataset by using field name sufix ".EnumName".
Improved: IdEq method in TLinq.
Improved: TGlobalConfigs.AutoMappingDefaultCascade now split in two different properties for Association and ManyValuedAssociation (breaking change).
Fixed: TGuid properties and fields were causing occasional errors in Flush method calls.
Version 1.6 (Sep-2012)
New: Delphi XE3 support.
New: Support for FIBPlus components.
New: TCriteria.RemovingDuplicatedEntities allows removing duplicated objects from result list.
New: Properties Count and PropNames in TCriteriaResult object provides additional info about retrieved projections.
Improved: Better support for other date types (string and julian) in SQLite database.
Improved: Possibility to use descendants of TList<T>/TObjectList<T> for many-valued associations.
Improved: Non-generic TObjectManager.Find method overload accepting a class type as parameter.
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.
Version 1.5 (Jun-2012)
New: Guid, Uuid38, Uuid36 and Uuid32 identifier generators allow client-side automatic generation of GUID and/or string identifiers.
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) or database string fields.
New: Support for Absolute Database.
Version 1.4 (May-2012)
New: Dynamic properties allows mapping to database columns at runtime.
Improved: TCriteriaResult object can retrieved projected values by projection alias.
Improved: TCriteriaResult objects supported in TAureliusDataset.
Improved: Better validation of MappedBy parameter in ManyValuedAssociation attribute.
Improved: TAureliusDataset.Post method now saves object if it's not persisted, even in edit mode.
Fixed: Issue with association as part of composite id when multiple associations are used in cascaded objects.
Fixed: Manual Quick Start example updated with correct code.
Fixed: Automapping was not correctly defining table name in some situations with inherited classes.
Version 1.3 (Mar-2012)
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: Support for ElevateDB database server.
New: Paging query results now supported by using new TCriteria methods Skip and Take.
New: TCriteria.Open method allows returning a cursor for fetching objects on demand.
New: TBlob.LoadFromStream and SaveToStream methods for improved blob manipulation.
New: "Not" operator supported in TLinq expressions and "Not_" method in TExpression.
New: TAureliusDataset.InternalList property allows access to the internal object list.
Improved: TObjectManager.Find<T> method introduced as an alias for CreateCriteria<T> method for query creation.
Improved: TCriteria.UniqueResult now returns nil if no objects are returned.
Improved: TCriteria.UniqueResult returns the unique object even if the object is returned in more than one row (duplicated rows of same object).
Improved: NexusDB through UniDac components now supported.
Version 1.2 (Mar-2012)
New: Fully documented TAureliusDataset component for visual binding objects to data-aware controls.
New: Support for UniDac components.
Improved: Better error handling with more detailed and typed exceptions being raised at key points, especially value conversion routines.
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.
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: Issue with lazy-loaded proxies using non-id columns as foreign keys.
Fixed: Adding Automapping attribute was not requiring Entity attribute to be declared.
Fixed: Automapping in a subclass in a single-table hierarchy caused issues when creating database schema.
Fixed: Memory leak in MusicLibrary demo.
Version 1.1 (Feb-2012)
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: Default value of OwnsObjects property in TObjectManager changed from false to true (as stated by documentation).
Fixed: Memory leak in MusicLibrary demo.
Fixed: Component adapter was ignoring explicitly specified SQL dialect.
Fixed: Issue with automapping self-referenced associations.
Version 1.0 (Jan-2012)
- First public release.