Modeling

The base class for data models is ModelBase. This will provide you with the following capabilities:

If revertible change tracking is desired, use ChangeTrackingModelBase as your base class. This includes the following interfaces

  • IChangeTracking: Indicates whether an object has unsaved changes.
  • IRevertibleChangeTracking: Allows the unsaved changes to be reverted.
  • IPropertyChangeTracking: Provides a list of changed properties. Used for logging changes and by the Chain ORM for generating more efficient SQL.
  • IDetailedPropertyChangeTracking: Adds the ability to retrieve the previous value, which is useful when logging changes.

The EditableObjectModelBase further extends this capability by added a second level of undo support via the IEditableObject interface. This is used in WinForms/WPF data grids and should be considered for any modal dialog.

For collections, create a subclass of ModelCollection, ChangeTrackingModelCollection, or EditableObjectModelCollection as appropriate.

Property Change Notification

Simple property change notification is handled via a pair of helper methods.

public string FirstName
{
    get { return Get<string>(); }
    set { Set(value); }
}

Using this model, the actual values are stored in a dictionary that is used for validation, change tracking, and undo support.

If you need to specify a non-standard default, use this syntax to avoid accidentally setting the IsChanged flag.

public int HitPoints
{
    get { return GetDefault<int>(50); }
    set { Set(value); }
}

If your default is an object, you’ll need to use GetNew<T> instead. This can call the default constructor or invoke a Func<T> to avoid unnecessarily allocating memory. This is most often used for collection properties.

//C# 6
public SimplePersonCollection Childern => GetNew<SimplePersonCollection>();

//C# 5
public SimplePersonCollection Childern
{
    get { return GetNew<SimplePersonCollection>(); }
}

For advanced scenarios, see Property Change Notification.