Rockford Lhotka
    CTO at Magenic
    Author, speaker, software architect
    Creator of the CSLA .NET framework

About me
Contact me


Version 4.0.0 change log


This document is the change log for CSLA 4 version 4.0.0.


CSLA 4 includes support for .NET (Windows) and Silverlight.


For a more complete list of changes, go to, select “all issues” and filter the status to “closed” and/or “checked in”.


Click here for a list of known issues with this version.


Release 4.0.0-100723:


LoadProperty (100722)

Apply the non-generic LoadProperty() change to CommandBase and ReadOnlyBase.


RC1 4.0.0-100719:


Samples (100719)

Removed all samples that won’t be updated for CSLA 4 to avoid confusion. Some of these samples may come back in the future as time permits, but for now only samples that build in CSLA 4 will remain.


RuleUri (100719)

Add Arguments property.


EditableRootListBase (100719)  Breaking change

Renamed ERLB to DynamicListBase and DynamicBindingListBase. Fix base class types for WPF/SL as well as Windows Forms. Fix AddNewCore() on .NET side so it returns type T instead of object.


Snippets/Templates (100716)

Add and update some snippets and templates for VB and C#.


LoadProperty (100715)

Undo the Beta 3 change to the non-generic LoadProperty() method so the non-generic LoadProperty() no longer calls the property setter. Calling the property setter is problematic, because it forces properties to have setters, and forces Silverlight setters to be public.


The new implementation of the non-generic LoadProperty() now uses reflection to directly invoke the generic LoadProperty() method. This ensures that the non-generic behavior is the same as the generic behavior, and doesn’t require that properties have a setter.


Child data portal (100715)

Fix null reference issue in the exception handling code in child data portal.


Dependency rule (100714)

Constructor for Dependency rule now accepts a list of affected properties, allowing for one-to-many dependencies to be established with a single rule.


BusinessRules (100719)

If a rule throws an exception, BusinessRules now includes the rule:// URI as part of the description (along with the exception Message property) to make it easier to determine which rule threw the exception.


RC0 4.0.0-100708:


Snippets/templates (100708)

Update snippets and templates for CSLA 4 changes.


Data portal exceptions (100708)

Fix bug with data portal exception handling and SilverlightRequestProcessor.


CslaModelBinder (100708)

Add support for block mode updates and make that the default. CslaModelBinder now suppresses rule checking, allows the model properties to be updated, then runs all object rules before saving the object.


This involved adding an ICheckRules interface to CSLA, so other UI frameworks can also use this interface to suppress/resume/check rules.


Business rules (100707)

Add Dependency rule to enable reverse dependent properties.


BusinessPrincipalBase/CslaPrincipal (100707) Breaking change

Rename BusinessPrincipalBase to CslaPrincipal.


BusinessBase (100705)

Remove non-async DataPortal_Create() method from Silverlight implementation.


BusinessRules (100705)

Fix bug in GetFirstMessage().


BusinessListBase (100704)

Throw an exception when a non-child object is added to a BusinessListBase.


PropertyStatus (100629)

Fix issue with PropertyStatus not displaying/refreshing properly.


ObjectStatus (100629) Breaking change

Remove ObjectStatus.


RuleUri (100625)

Encode path data to handle special characters.


Beta 3 4.0.0-100625:


CslaDataProvider (100625) Breaking change

The RemoveItem() method now accepts two parameters (sender, ExecuteEventArgs) so it is compatible with TriggerAction and InvokeMethod.


RuleUri (100625)

Fix an issue where a long type name would cause System.Uri to fail. On .NET it has a limit of around 256 characters, and on Silverlight just 63 characters for each part of a path name. The fix breaks any long type name into 63 character parts behind the scenes, allowing System.Uri to work as expected.


LoadProperty (100624) Breaking change

The non-generic LoadProperty() method now always invokes the property setter, so it indirectly always uses the generic LoadProperty() method. This means there is complete parity between the two implementations, but it does mean there’s slightly more overhead with the non-generic version of the method. In the case of BusinessBase, the property setter is invoked within a BypassPropertyChecks block, so it does a load operation, not a set operation.


IsBusy/IsSelfBusy/IsPropertyBusy (100624)

These three property/methods are now virtual.


Async rules (100623)

Provide the Target property to an async rule if the rule explicitly sets a ProvideTargetWhenAsync property to true. Obviously if the rule uses the Target property on a background thread that’ll cause major problems, but that is just bad code and the developer deserves what they get.


This does have some interesting ramifications for rule chaining. If async rules chain to other rules (sync or async), the Target value is only provided through the chain when the parent async rules (all the way up the chain) have ProvideTargetWhenAsync set to true.


ASP.NET MVC Authorization (100623)

Added HasPermissionAttribute and a set of HasPermission Html extension methods to simplify applying CSLA per-type authorization rules to controller actions and code in a view.


ASP.NET MVC ViewModelBase (100623)

Added a ViewModelBase class to provide a basic implementation of IViewModel.


BusinessRule (100623)

Remove unused default properties from the base class.


RuleContext (100623)

Add a public constructor to enable simpler unit testing of rules.


Authorization (100616)

CanReadProperty/CanWriteProperty now call FirstOrDefault.


File headers (100614)

All code files now contain a standard copyright header.


EditableRootListBase (100606)

EditableRootListBase now has a default AddNewCore() implementation.


Data Portal (100603)

It is now possible to change the server exception before it is wrapped in a DataPortalException and returned to the client. This is done by implementing IDataPortalExceptionInspector and using a config entry to tell the data portal to invoke your implementation.


There is now also a GenericBusinessException type you can use to contain information about non-serializable exception objects that might be thrown by some components on the server. Remember that all exception objects must be serializable to flow back through the data portal to the client.


Field manager (100601)

Fix bug with RelationshipTypes enum.


TriggerAction (100601)

Fix issue with setting TriggerEvent property.


PropertyStatus (100601) Breaking change

Remove TargetControl property. Instead of using TargetControl, you should have your UI control bind to the properties of the PropertyStatus control to do things like enable/disable, or change visibility.


CslaModelBinder (100526)

Fix duplicate validation error message issue. This also involved adding a new IViewModel interface that a viewmodel should implement so CslaModelBinder can differentiate between a viewmodel and other types of object.


Authorization (100525)

Add a TargetType property to AuthorizationContext so a rule will always have access to the type of the target business object.


Beta 2 4.0.0-100528:


INotifyDataErrorInfo (100520)

Add INotifyDataErrorInfo implementation to BusinessBase for Silverlight.


Base classes (100520)

Make sure base classes implement Initialize() and OnDeserialized().


BusinessRules (100520)

Fix bug with SyncRoot not being set after deserialization.


Common rules (100520)

Add Severity property to common rules.


PrivateField relationship type (100519)

Add new PrivateField relationship type to IPropertyInfo so property metadata can know that a property has a private backing field. This change includes making ReadProperty() and LoadProperty() automatically get/set these values using reflection.


BusinessRule (100519)

Make IsAsync a virtual property, so it is possible for a rule to adjust whether it is sync or async based on LogicalExecutionLocation.


DataAnnotations (100515)

Fix property name display for broken validation rules.


BusinessBase (100514)

Add missing Display attribute on IsSelfBusy property.


ReadOnlyBase (100514)

Fix issue with MarkIdle() method.


MinLength rule (100512)

Fix issue with MinLength rule.


ReadProperty/ManagedObjectBase (100511)

Fix issue where ReadProperty() wasn’t properly using default values.


Business rules (100510)

Ensure StopProcessing works with successful rules.


Templates (100510)

Update templates for CSLA 4.


Business rules (100507)

Add SuppressRuleChecking back into rule system.


Beta 1 4.0.0-100503:


PropertyStatus (100430)

Enhance PropertyStatus to make it easier to subclass the control for customization.


EditableRootListBase (100428)

Root objects are now marked as being busy while they are being saved.


Silverlight data portal (100428)

Add config option so it is possible to prevent the data portal from sending the client-side principal object to the server on each data portal call.


Authorization Rules (100427) Breaking change

Redesign and implement the authorization rules system.


MethodInfo (100424)

Add a MethodInfo type, which implements Csla.Core.IMemberInfo. This is like PropertyInfo<T>, but for methods, and is used by CanExecuteMethod().


This also means there are now RegisterMethod() methods in BusinessBase and ReadOnlyBase.


ViewModelBase (100421)

Add some pre-processing methods to ViewModelBase.


Execute control (100421) Breaking change

Removed the Execute controls for WPF and Silverlight. Blend 4 has a behavior that does the same thing, so it is better to switch to the Microsoft functionality.


Preview 4.0.0-100416:


Csla.Xaml.Silverlight (100416) Breaking change

Move the Csla.Xaml files out of Csla.Silverlight and into Csla.Xaml.Silverlight. To use the Silverlight controls in Csla.Xaml it is now necessary to reference the Csla.Xaml.dll file from \bin\...\Silverlight.


This eliminates the System.Windows.Interactivity.dll reference from core CSLA.


EditableRootListBase (100414)

Fix issue with undo.


SetProperty/LoadProperty (100413)

SetProperty() and LoadProperty() now use ReferenceEquals() to determine equality for child objects.


Business and validation rules (100411)

Continued work and stabilization of the new rules system.


ReadProperty/LoadProperty (100407)

The non-generic ReadProperty() and LoadProperty() methods are now virtual in BusinessBase, allowing a class to override them to handle private backing fields.


Preview 4.0.0-100405:


Setup program (100405)

This release is available as a setup program instead of a regular zip archive.


Business and validation rules (100405) Breaking change

The new business and validation rules subsystem is in this release. This is a major change, and is described in this blog post.


IDataErrorInfo (100401)

Add IDataErrorInfo support for Silverlight, now that Silverlight 4 supports the interface.


Data portal and enum values (100326)

It is now possible to pass enum values through the Silverlight data portal.


.NET 4 Client Profile (100326)

Removed the csla.client project and changed csla.core to target the .NET 4 client profile. As a result, csla.core is now named Csla, and it builds into \bin\Client. This assembly works in the client profile and full .NET and so is the one Csla.dll necessary for core CSLA functionality on the .NET platform.


The Csla.Silverlight project is unaffected and continues to build Csla.dll in \bin\Silverlight.


Data portal (100324)

The .NET WcfProxy data portal channel will now use the CslaDataPortalUrl config value by default. It also defaults to using wsHttpBinding with maxed out message size limits.


CommandBase (100323) Breaking change

CommandBase now implements IClonable, which means it works with automatic cloning when using a local data portal deployment. This brings command objects into line with other object types.


RegisterProperty (100316)

RegisterProperty() now picks up friendly names for properties from any display attributes (from DataAnnotations or System.ComponentModel in that order) if the attributes are present. This eliminates the need to supply a friendly name on the RegisterProperty() call itself.


Note: passing a null to RegisterProperty() for a friendly name means RegisterProperty() will look for the attributes, and fall back to using the property name if the attributes are not present.


Data portal impersonation (100314)

Add attribute to allow impersonation to work through the WCF data portal channel.


Custom data portal channels in SL (100314)

Alter the Silverlight data portal so it is possible to create custom proxy/host channels for the data portal that aren’t based directly on WcfProxy. In other words you can now build a proxy/host for something other than WCF, or to use third party WCF bindings.


Compressed data portal sample (100314)

Add a sample showing how to apply compression to a .NET data portal channel in a way that is similar to how compression can be plugged into the Silverlight data portal.


Generic data portal (100308) Breaking change

Removed non-generic DataPortal methods. As a result, it is no longer necessary to pass the business object type in the criteria, so any serializable value (object or primitive) can now be used as a criteria value. For example:


var cust = DataPortal.Fetch<Customer>(123);


On Silverlight the criteria value must be serializable with the MobileFormatter, and so must be an IMobileObject or primitive type (int, string, Guid, etc).


TriggerAction control (100308)

Added a TriggerAction control, which is much like InvokeMethod or Execute, but works using drag-and-drop from the Toolbox in Silverlight and WPF, so it is friendly to use with the VS10 designer.


Additionally, it is possible to have numerous TriggerAction controls attached to one UI control in the case that you want to handle several UI control events.


LinqObservableCollection (100305) Breaking change

Removed LinqBindingList and the related LINQ to CSLA functionality from 3.8. This includes removal of indexed lists.


In its place, added LinqObservableCollection and an extension method for any ObservableCollection called ToSyncList(). This extension method creates a LinqObservableCollection that is synchronized to the original list.


This is an explicit action, and so is quite different from the previous implementation. In this new model you do your query as normal, and then sync the results of the query (or the query itself) to the original list using ToSyncList(). This provides for a lot more control over the process and avoids the numerous unexpected side-effects of the previous model.


DataAnnotations in .NET (100305)

DataAnnotations attributes are now available on the .NET side of CSLA, because the assembly is now included in the client profile as of .NET 4 RC.


Paged list sample (100305)

Added a sample showing how to create an asynchronously loading paged list object. This is particularly useful in Silverlight, but works in WPF and Windows Forms as well.


RegEx rule (100305) Breaking change

Remove regex expressions from CSLA .NET. The RegEx rule is still there, but no longer includes pre-defined regex expressions.


MethodCaller (100303)

MethodCaller on Silverlight now uses lambda expressions instead of reflection to dynamically invoke methods.


PropertyStatus/BusyStatus (100303)

Fix issues that were blocking the use of these controls in WPF.


CslaModelBinder (100226)

Add a CreateModel() implementation to CslaModelBinder so it can automatically create business object instances.


CommandBase, CriteriaBase, CslaIdentityBase (100226) Breaking change

Changed CommandBase and CriteriaBase to be generic types. Added CslaIdentityBase as a generic type, which is the base class for CslaIdentity. While this is a pretty big breaking change, it means that the RegisterProperty() syntax is now the same for all base class types, which is very helpful.


Data portal XAML design time (100226) Breaking change

Removed all XAML design time support concepts from the data portal.


TriggerAction (100224)

Add TriggerAction control, which works like InvokeMethod or Execute, but is VS10 designer-friendly.


Data portal (100221)

Optimize creation of data portal proxy object. Also added CslaDataPortalProxyFactory config setting and IDataPortalProxyFactory interface to open up how proxy objects are created.


Visual Studio 2010 RC (100219)

Various updates for compatibility with VS10 RC.


ViewModelBase (Silverlight) (100218)

The Silverlight ViewModelBase class now inherits from DependencyObject instead of FrameworkElement, so it matches the WPF implementation and is more flexible.


ViewModel (100218)

Added IViewModel interface to make viewmodel objects polymorphic.


Wpf\Authorizer (100216) Breaking change

Remove the Authorizer control.


PropertyChanged events (100216) Breaking change

Make Xaml the default behavior for PropertyChanged notification


PropertyInfo<T> (100207)

Changed scope of Index property so it is only accessible through interface Core.IPropertyInfo. This allows people to more safely make their IPropertyInfo objects public in scope.


FilteredBindingList (100204)

Added overload for ApplySort that accepts string PropertyName and ListSortDirection.


MethodCaller (100202)

CallByName() now uses Csla.Reflection, and so gets the benefit of the dynamic lambda creation used to optimize performance (actually avoiding most reflection).


SetParent() method (100202)

SetParent() is now a virtual method.


Pre-Release 4.0.0-100201:


ViewModelBase (100129)

Add Browsable(false) to properties of object that shouldn’t be visible in Data Sources window.


Parent property (100129)

Parent properties are now marked as Browsable(false) so they don’t appear in the Data Sources window and are ignored by DataMapper.


Data Portal (100126) Breaking change

When using an object factory with a command object, the data portal will now call an Execute() method instead of Update().


Windows Forms data binding (100123)

Enhance data binding support so a business object can be bound to multiple BindingSource controls (and therefore forms) at the same time. There’s a new MultipleBindingSources sample that illustrates how this works.


BindingSourceRefresh (100119)

Fix issue with .NET 4.0 client profile and the way the control binds itself to the host. This was necessary to make the control work in .NET 4.0.


BusinessBase (100119)

OnPropertyChanged() now has an overload that accepts a PropertyInfo<T>.


SL FieldData (100119)

Silverlight FieldData.IsDirty is now virtual.


SL data portal (100115)

Client culture values now flow to server through data portal from Silverlight client.


SmartDate (100113)

SmartDate tests changed to work better internationally.


SortedBindingList (100111)

SortedBindingList throws an exception if the sort-by property name doesn’t exist.


BusinessListBase, BusinessBindingListBase (100105)

Add a default implementation of AddNewCore() that uses DataPortal.CreateChild() to create an instance of the child object.


Pre-Release 4.0.0-100108:


BusinessListBase (100107)

Add default implementation of AddNewCore() that uses DataPortal.CreateChild() to create an instance of a new child object. You can still override this method to do your own thing, but the default is now to just work – oh, and AllowNew now defaults to true of course.


BusinessListBase, BusinessBindingListBase (091218) Breaking change

BusinessListBase now inherits from ObservableCollection<T> - there’s a whole new inheritance hierarchy to support this. The behavior of the new BusinessListBase should be functionally comparable to previous versions, but it now raises CollectionChanged instead of ListChanged, and now integrates nicely with WPF, but won’t work properly with Windows Forms.


BusinessBindingListBase is the old BLB, just renamed. It still follows the same inheritance hierarchy it did before, so if you use Windows Forms you should be able to just change your business class to inherit from BBLB and it should continue to work.


On Silverlight, BBLB is just a subclass of BLB – they both work the same way. I added BBLB to Silverlight to maintain parity between the platforms, but generally speaking you should use BLB instead of BBLB unless you are reusing an existing BBLB collection from existing .NET Windows Forms code.


Csla.test (091204) Breaking change (build/test)

Modified the unit test projects to work with mstest instead of nunit. They may still work with nunit, but I will be using mstest going forward. As of this date 505 of 517 tests pass, so there’s a little work to be done.


Flatten folder structure (091204) Breaking change (build)

Bring the older folders (like Csla.core) up a level – essentially eliminate the intermediate \Csla\ folder and intermediate sln files.


Parent property (BusinessBase/BusinessListBase) (091203)

The Parent property is now public scope.


MobileFactory (091203) Breaking change

Move MobileFactoryAttribute to the Csla.Server namespace/folder.


Silverlight 4 (091125) Breaking change

Update CSLA .NET for Silverlight and its test project to build targeting Silverlight 4 PDC beta.


Csla.Xaml namespace (091105) Breaking change

Following Microsoft’s general lead, the old Csla.Wpf and Csla.Silverlight namespaces have been changed to Csla.Xaml. This means all XAML-oriented types from WPF and Silverlight are now all in the same Csla.Xaml namespace, providing a higher level of consistency between the two platforms.


Solution structure (091105, 091203) Breaking change (build)

Rearrange the solution structure and svn repository structure as follows:
















This puts the server/core (full .NET), client (.NET client profile) and Silverlight projects as top-level elements in the source folder, and arranges the samples folder as a peer. It also puts the UX technologies in their own assemblies per-technology.


There’s also a top-level csla.all.sln file that opens all three source projects so it is easy to open and build all three flavors of CSLA .NET.


And a csla.test.sln file that opens the CSLA .NET for Windows projects with the corresponding unit test projects.



(Updated 7/23/2010 9:33:09 AM)