We’ve recently managed to migrate all our product lines from CSLA 3.7 to CSLA 4.0 and here are problem/solutions scenarios.
  • Problem:
    Class contains backend field, but is not registered
    If you don’t do it, exception Csla.PropertyLoadException will be raised with message
  • Property load or set failed for property MyField  (Properties with private backing fields must be marked as  RelationshipTypes.PrivateField)
Solution:
Register backend field:
private int _my_field;
private static readonly PropertyInfo<int> MyFieldProperty = RegisterProperty<int>(o => o.MyField, "My field", RelationshipTypes.PrivateField);
public int MyField
{
       get { return GetProperty(MyFieldProperty, _my_field); }
       set { SetProperty(MyFieldProperty, ref _my_field, value); }
}
Problem:
Method LoadProperty was used like this:
<p>LoadProperty(MyFieldProperty, 10);</p>
exception Csla.PropertyLoadException will be raised with message “Csla.PropertyLoadException: Property load or set failed for property MyField (Attempt to read/load private field property in managed properties.) —> System.InvalidOperationException: Attempt to read/load private field property in managed properties”
In this case, you have to initialize backend field :
_my_field = 10;
  • Problem :
Class contains readonly field ,
private readonly int _my_field;
and you try to set the value using binding, runtime exception raised with message:
“Expression must be writeable Parameter name: left”“Expression must be writeable Parameter name: left”
Solution:
Solution:

Make field static

private static readonly int _my_field;
  • Problem:
Class is inherited from base class :

[Serializable]
public class MyBaseClass<T> : BusinessBase<T> where T : MyBaseClass<T>
{
}

[Serializable]
public class MyConcreteClass : MyBaseClass<MyConcreteClass>
{
   protected static PropertyInfo<string> ConcretePropProperty = RegisterProperty(typeof(MyConcreteClass), new PropertyInfo<string>("ConcretePropProperty"));
   public string ConcreteProp
   {
      get { return GetProperty(ConcretePropProperty); }
      set { SetProperty(ConcretePropProperty, value); }
    }
}

and if properties in MyBaseClass are not registered exception raised with message:

The type initializer for ‘MyConcreteClass’ threw an exception.System.TypeInitializationException: The type initializer for ‘ MyConcreteClass’ threw an exception. —> System.InvalidOperationException: Cannot register property ConcretePropr after containing type (MyBaseClass) has been instantiated
Solution:
You have to register every property in concrete class.
  • Problem:

    Class is inherited from BusinessListBase or BusinessBindingListBase. Adding new items in collection cannot be done.

Solution:
All items that will be added to collection must be created like child.
Did you have issues and would you like to share with community ?

Tags: , , ,