Today we've released LLBLGen Pro v5.10 BETA! We've added some great new features and corrected some mistakes.
What's new in the LLBLGen Pro Designer
Major changes / fixes / new features
- .NET 7 is now a supported target platform
- Entity Framework Core 7 is now a supported target framework
Minor changes / new features
- .typeimports files now support nested enum types and also multiple wildcard characters in the type names with nested types.
- When adding relational model data for a new database in the project, the database specific template bindings for this database are automatically added to all existing
code generation preferences in the project so generating code without opening the task editor will now correctly pick up the template bindings for this new database.
Fixes
- Fixed: When switching databases in the designer, it could be the generated code still used presets specific for the original database type.
- Fixed: In an edge case when a field in a unique constraint read from the schema is missing from the table (e.g. due to field name mismatches) the designer will now ignore the field instead of crash.
What's new in the LLBLGen Pro Runtime Framework
New functionality / changes
- The framework now supports inserting entities directly based on a query (INSERT INTO ... SELECT ...). This is implemented using QuerySpec.
- Derived Model fetching now allows for additional where / orderby clauses to be specified for nested sets in the projection.
Small changes / fixes
- We’ve added a global setting to EntityBase and EntityBase2, ValidatePrecisionScaleSingleDoubleValues. This setting is true by default. When set to false, it’ll skip the precision/scale check in ValidateValue for float/double values and always allow them. This setting is true by default to prevent breaking changes, however it makes little sense to validate precision/scale on float/double values as they’re not precise (so precision/scale validation/checks shouldn’t be done)
- The ObjectGraphTraverser now distinguishes ISortClause objects and when traversing SortExpressions it’ll call the Traverse method for ISortClause objects.
- For inserts, a field-parameter pair is added to a dictionary, but the hashcode for field is using the hashcode of the value (plus the object instance address). In v5.10 we changed this to only use the object address instance (Object.GetHashCode()) as it’s an unnecessarily expensive calculation as we just need to identity field objects.
- Linq: There’s now an IQueryable.ToDictionaryAsync() implementation to fetch a linq query into a dictionary asynchronously. The ToDictionaryAsync method only accepts a keySelector func. There’s no overload to reproject the resultset. The main reason is that it’ll undo projection work of the main query so it’s always better to move the element selector/projector func to a select called prior to the ToDictionaryMethod. So q.Select(projectorFunc).ToDictionaryAsync(keySelectorFunc); instead of q.ToDictionaryAsync(keySelectorFunc, projectorFunc); as the latter is inefficient: it’ll allocate objects that are never used.
- All DataReader.Read() calls on async paths have been converted to DataReader.ReadAsync(). This should give consistent exceptions when a task is cancelled. It might have some impact on runtime behavior as some ADO.NET providers might have edge cases which aren’t 100% efficient with ReadAsync() but are with Read(). However the alternatives we have had for a long time aren’t without problems either so we’ve chosen to make this switch now.
How to get the bits?
If you have an active subscription, please go to 'My Account' in the menu and in the v5.10 download section, you'll find the LLBLGen Pro v5.10 beta installer.
Feedback
For feedback/bug reports, please open a new thread in the Beta forum
Enjoy and stay safe!