Runtime: Potentially invalid handling of managed inverse collections can lead to exceptions and incorrectly set data when detail instance is of derived type - When a managed inverse collection involves a detail type that is not the root of a persistent class hierarchy, but is from a derived persistent class, the changes of the collection need to manage the inverse reference too. This management can fail when the persistent base classes of the detail type have persistent struct fields, artificial fields or other fields that are not directly user visible (e.g. version field).
The effects can lead to exceptions because the type converter cannot handle incompatible values, or can lead to inconsistently stored data.
Add New Item Wizard: 'CamelCase' class casing removes underscores from the table names. - Class names generated by OpenAccess now include the underscores from the table name when 'CamelCase' class casing is specified.
Attributes Mapping: Attributes mapping does not take into account schema names for join tables - The JoinTableAssociationAttribute that defines a join table does not provide a way to specify the schema name of the join table used in a many-to-many association.
Enhancer: An null reference exception is thrown if an identity member cannot be found. - The enhancer used to throw a null reference exception if the identity or version member specified in the metadata cannot be found.
Fluent Code Generation: Uncompilable code generated if Generate Context and Generate Multiple Files options are disabled. - The Fluent API namespaces are now added when generating into a single file and with no context.
Generate OpenAccess Domain Model Service: Resolving contexts can fail in certain isolated scenarios. - The Generate OpenAccess Domain Model Service wizard can now always (given that the solution is built) find the contexts from the solution and list them on the first page.
LINQ: Ordering by subquery count produces exceptions - When ordering is performed on the result of a sub query aggregate, an exception is thrown.
LINQ: Invalid SQL generated when translating entity.StringField.Contains("X") == Y - When the string.Contains(string) method is used on a persistent member and the right side is a constant value, the translation of the expression is wrong and invalid SQL.
Workaround: Use negation or compare to a boolean parameter.
LINQ: Translation of persistentMember.ToString() leads to potential truncation for string columns - When a varchar(80) column is used in a LINQ expression 'member.ToString() == param', the resulting SQL contains a cast to varchar(60) causing string truncation.
Workaround: Do not use ToString() on string fields.
LINQ: Using byte[] parameter leads to interpretation as byte parameter collection instead of single parameter - When a byte[] parameter is used in a LINQ expression, the parameter is interpreted as collection of byte values rather than one value.
Profiler: Error not shown if the binary event log format is too old. - If a binary event log is produced by an older version of the profiler, the error message was hidden and no events were visible. OpenAccess now shows a proper error so that the user can update the runtime system or downgrade the used profiler.
Runtime: Invalid conversion of SQL 'exists' nodes can lead to 'Query too complex' exceptions - When a LINQ Any/Contains expression that is transformed into an SQL 'exists' expression is combined with another condition by AND, a 'Query too complex' exception could be thrown.
Runtime: Ordering by primary keys of joined extents is not working - When a LINQ expression of type srcA.Join(srcB, a => a.Id, b => b.Id, (a,b) => new { a, b }).OrderBy(x => x.a).ThenBy(x => x.b) is given, the ordering of b was not appended to the SQL.
Runtime: Ordering by reference members not possible - When a LINQ expression is given like 'from p in ctx.Persons order by p.Spouse', the ordering is not appended in the generated SQL.
Workaround: Use explicitly the id field as in ' from p in ctx.Persons order by p.Spouse.Id'. This will lead to an additional join however.
Runtime: Shared Column synchronization missing when instance is made persistent by reachability only. - When an instance that has synchronized fields is made persistent by reachability alone (that is, no context.Add/scope.Add was performed explicitly), the field synchronization code is not invoked.
This can lead to missing references in the database, because the foreign key values that were specified by simple fields will not be taken into account and NULL values are inserted instead.
Workaround: Either use managed collections or call context.Add() with the instance explicitly.
Runtime: Projection of references or extents variables with composite foreign keys can lead to missing columns in projections - When a composite foreign key or an extent iterator is projected in a LINQ expression, the resulting SQL select clause can have to few columns, causing errors and exceptions during projection result read operations. This applies only if the foreign key reference itself is projected, not a field of the referenced instance.
Schema read: A null reference exception is thrown while reading the database schema for Advantage Database Server if the database has indexes defined using a sql expression - An index in Advantage Database Server can be created using a SQL expression which is evaluated by the expression engine to calculate the index column. Such index definitions are not supportd by OpenAccess, at the moment.
If a database has such an index the schema read process throws a NullReferenceException. This has been fixed to now ignore such indexes.
Advantage Database Server also allows a user to connect to a database created with a password, without specifying the password. While reading the database schema with such a connection (where no password is specified) a NullReferenceException is thrown.
The exception is now improved with details about the possible missing password. Specifying a valid username and password fixes the problem.
Enhancements
Runtime: Prevent parallel GC beeing triggered by empty connection pool - When the connection pool is empty (all connections are in use), the blocked thread requests a garbage collection. The fix prevents that multiple blocked threads will lead to parallel invocations of System.GC.Collect.
Workaround: Use a proper setting for the maximum size of the connection pool so that blocking is prevented.
Batch Operations Dialog: The Change CLR Type operation cannot handle nullable types - The batch operation for members "Change CLR Type" does not provide any means of selecting a nullable type. The user should be able to select a nullable equivalent for all available value types.
Validation: Usability improvements and fixing visual glitches to the Validation dialog - Numerous improvements to the validation dialog including: validation for NumericUpDown controls, extra validation rules for discriminator columns, better keyboard support, etc.
Visual Studio Integration: Added new items in Telerik -> OpenAccess -> Help menu. - Added links to the new help sections and the newly shipped 'Getting Started with OpenAccess' pdf guide.
Association editor: Association mapping can be lost if the columns used are not mapped to primitive members. - Associations that use columns that are not mapped in the model as their foreign keys are now correctly persisted while working with the designer.