After 3 months of development, we finally released a new LLBLGen Pro version, v1.0.2004.1! This update was focussed on upgrading the GUI with various new features like creation of relations and custom properties (name-value pairs, usable to generate gui elements at runtime for example), updating our database provider model to make sure all logic and gui elements is located in the driver assemblies, adding various small enhancements under the hood and add support for Oracle 10g and Firebird 1.x/Interbase 6.0.
We also changed the demo application, it's now a time-trial application which works for 14 days. Previously our demo application was feature-limited (you couldn't create a project with your own database).
Below is the full list of new features/fixes/changes. Interested? Give it a testdrive: http://www.llblgen.com
Edit: I forgot to mention that as always, this upgrade is free for customers. .
What's new/changed in the LLBLGen Pro designer version 1.0.2004.1 enhancements?
- Events which are fired between (entity/typedlist/typedview) objects are now much more fine grained so code can handle an event much more efficiently.
- Bad FK's (pk fields are not forming the complete PK or the fields set as PK aren't PK anymore) are now filtered out.
- Duplicate Unique constraints are now filtered out.
- Project load didn't work if the file was read-only, because the .NET de-serializer code requires a writable file. There is now a check in place which checks this up front to avoid a nasty exception.
- When a primary key changed or unique constraint changed, the refresher didn't report this change. It is however essential to know this information so code can be re-generated to adapt these changes.
- When a table has been renamed and the refresher detects this, it's now mentioned as a change in the project, as it is required that the user re-generates the code.
- A change in the identity flag is now reported by the catalog refresher.
- Better information reporting by the catalog refresher when an aspect of a table type definition was changed.
- IDBDriver now has a new method DbTypeIsNumeric() which returns true if the passed in DbType value is a numeric type (and thus can be used for sequencing)
- Catalog refresher's check for a renamed table was too strict, now it just verifies types of fields, not the names anymore.
- Preferences now has a setting for the encoding type of output files
- Project now has a setting for the encoding type of output files. The value is initially inherited from the preferences.
- Adapter: TypedList.GetRelationInfo() now returns a new RelationPredicateBucket object instead of an existing one. The old situation lead to errors when the GetRelationInfo() was used in a loop and a predicate was added to the PredicateExpression in the bucket.
- All, VB.NET: EntityField enum and TypedView field enum definitions have now the names enclosed in  to avoid keyword name clashes, which occur due to compiler limitations.
- Adapter: If an entity had a relation with self, and GetRelationInfo() was called to retrieve the RelationPredicateBucket to create the filter to fetch the related entities, a relation object was inserted, which was unnecessary and caused a crash in the join logic due to the fact that join-with-self is not yet supported.
- Selfservicing, All: During ReadXml() the load-on-demand (lazy loading) logic was still invoked due to the lack of testing for the right flag value.
- SelfServicing : recursive saves of graphs with loops failed. This has been fixed with a change to ITransaction to store extra transaction information and changes to EntityBase, TransactionBase and TransactionComPlusBase.
- All, All: Templates: When re-instantiating a tree of objects using ReadXml(), the synchronization data wasn't restored, so recursive saves didn't synchronize PK-FK relations.
- SelfServicing: TypedList.BuildResultset and TypedList.BuildRelationSet are now public and virtual (overridable).
- All: DAO templates are now database generic, using a single include template (new) which contains the namespace of the ADO.NET provider
- All: TypeDefaultValue templates now use an include template with the default value producing code. This way a developer can, by supplying a different binding through a different template set config file, inject different default value code into the generated code.
- All: Validator classes (for per field validation) now use an include template which is included in the Validate() method. In combination with the new If StringValueEquals statement a developer can inject per entity validation code directly into the generated code, by using a different binding through a different template set config file.
- Description of template sets now contain the version of the designer core.
- SelfServicing, all: Specifications of collection classes are now done with the full qualified name to prevent clashes with .NET framework class names. This means that an entity called 'Property' is now possible, as it will not result in code that doesn't compile anymore because of a clash with 'PropertyCollection', a .NET framework class.
- Adapter, all: EntityCollection objects in Entities are now created at first use. This saves memory and bandwith in remoting scenario's.
- Adapter, all: The destination folders for compilation results have been moved into the DatabaseSpecific and DatabaseGeneric folders, to avoid compilation deadlocks in some situations.
- Generation of static hashtables and XML comments for custom properties for: Entities, EntityFields, TypedList, TypedListFields, TypedView, TypedViewFields, ActionProcedureCalls, RetrievalProcedureCalls, and not for Project.
- More information emitted in the XML Comments about: table field characteristics an entity field is mapped on, entity fields in typed lists and typed view field characteristics
- Generation of Custom Properties for fields in the XML comments.
- Template include functionality based on ID's, using <# templateID #>. Include statements are resolved prior to template parsing/interpretation and can be nested (included templates can contain include statements again).
- Every class in the generated code has a new region definition which contains a template include statement. Per template there is one custom template ID reserved. Developers can bind a template to these IDs using a modified template config file, enforcing the 'injection' of the code in that template into the shipped LLBLGen Pro templates.
- The Project Explorer now populates an entity/typed list node when it is clicked open, not at startup. This greatly reduces lag in the application: Adding an entity, deleting an entity, renaming an entity, it is now a fraction of a second, even in very large projects (>200 entities)
- Bug with listview stealing away focus before fieldname textboxes could validate input has been fixed, by replacing the listviews with grids.
- Bugs with TypedList and entities being removed while added to a typed list.
- Renamer window's buttons weren't themed in XP.
- Typed views are now addable using the same mechanism as Entities.
- Revamped Entity/TypedList/TypedView/SPCall editors with more information divided on multiple sub tabs
- When a driver is not loadable, a messagebox is shown with the exception. Due to winforms issues, the exception is not shown in the exception viewer.
- All folder / file path textboxes are now writable.
- The folder browser dialog is removed, the .NET 1.1 folder browser dialog is its replacement, removing the slow WMI queries which results in much faster folder browsing experience.
- The destination folder can now also be relative to the project folder. If the destination folder specified starts with '.\' or '..\', the folder is relative to the project folder. If the destination is solely '.' the project file folder is used, otherwise the destination folder is seen as a complete path.
- Save of a project is now without popups or questions, it just saves the file. It now also checks if the file is readonly. If so, it fails and doesn't save.
- guistate.xml and preferences.xml are now moved to the user specific Application Data\LLBLGen Pro folder, which is automatically created by the installer and by the designer if it's not present.
- The user can now also select relation alternatives from a cyclic reference chain. Different algorithm implemented for calculating chain breakage.
- EntityEditor's sequence support now checks if the field type is numeric and if so, the sequence box is enabled (if applicable)
- Custom property (name-value pairs) support for: Entities, EntityFields, TypedList, TypedListFields, TypedView, TypedViewFields, Project, ActionProcedureCalls, RetrievalProcedureCalls.
- Fields mapped on relations can now be hidden
- Relations can now be hidden.
- Custom relations can be added/removed.
- Refresher skips new found relations if a custom relation equivalent is already in place.
- A schema now can be renamed in the catalog explorer.
- A user can now select which objects participate in the generator cycle. There are no checks for related objects. Default: All objects participate.
- Entity fields can now be marked 'read only'. Getter/setters are still generated, the field object is read-only so a set will throw an exception.
- Typed List fields can now be moved up and down in the field list. They also can be renamed now.
- All kinds of context menus are added to the project explorer tree nodes.
- Link to support forums added to Help menu in non-demo builds.
- SqlServer driver: The PK retrieval query contained a parameter name which had a different casing than the parameter definition itself. This led to errors when the database was installed using a case sensitive collation.
- All connection parameter controls are now part of the database drivers. This makes it easier to add database drivers.
- SqlServer driver doesn't contain the .NET 1.0 Decimal bug workaround anymore.
- All database drivers now implement the new IDBDriver.DbTypeIsNumeric() method.
- Firebird Interbase driver added. (Firebird 1.0/1.5/Interbase 6.0, dialect 3 only).
- Oracle 10g driver added.
- TDL Interpreter: If IsOneToOnePkPk FkSide checked the IsForeignKey flag on the startfield of the relation. Caused a bug when the class hierarchy was at least 3 classes deep, linked with 1:1 relations over solely PK's.
- Generator config files: failWhenExistent property for VS.NET project file tasks is replaced with alterWhenExistent. The value for alterWhenExistent is set to true.
- Generator config files: AssemblyInfo classes are now no longer overwritten when they already exist to allow custom versioning schemes.
- Generator config files: description now contain the designer core version numbers and versions have been updated. (v1.0.2004.1.date)
- Generator config files: binRootFolder parameter added to ProjectFileCreator task performer and to Adapter's project file creator tasks. This makes compilation result folders to be located in the project specific folders in Adapter, which avoids deadlocks in compilation in some situations.
- Task performers: ProjectFileCreator: The ProjectFileCreator task performer now can alter a project file, keeping the GUID the same. It adds, when it has to alter the project file, new files to the project while keeping the existing files. A user is now responsible for keeping the project file intact. A user can also opt for overwriting the project file, by setting alterWhenExistent to false. This will simply replace the File references with the ones generated, however it will keep the same GUID.
- TDLParser / Interpreter: If HasParameter [NoCursors] is changed to : If HasParameter [NoCursors | InputParameter].
- Task performers: CodeEmitter and ProjectFileCreator now use the encoding type specified in the project.
- TDL parser/interpreter:
- <[Foreach CustomProperty argument]><[NextForeach]>, where argument can be: Entity, EntityField, TypedList, TypedListField, TypedView, TypedViewField, ActionStoredProcedureCall, RetrievalStoredProcedureCall, Project
- <[If RelationIsHidden]>
- <[If MappedFieldRelationIsHidden]>
- <[If OppositeRelationPresent argument]>, where argument can be: Full
- <[If StringValueEquals StringValueName QuotedString]>
ORM Support classes (1.0.2003.3) / DQE's
- Oracle DQE: *LOB fields couldn't be saved in some situations.
- IActionQuery is altered with new code for SequenceRetrievalQuery support, so DQE's can be created for databases which do not support batched queries (Firebird, Access and others)
- Oracle DQE: Insert queries now utilize the dual query system when a sequenced field is part of the inserted fields. This is done to make the code compatible with Oracle 10g, which ODP.NET provider has changed related to returnvalue reporting on batched queries.
- ISequenceRetrievalQuery and class to runtimes.
- Oracle 10g support.
- Firebird support.