The documentation comes from the Markdown files in the source code, so is always up-to-date but available only in English. Enjoy!
Signum Framework provides a clear hierarchy of classes that serve as base classes for your own entities:
List<T> but with embedded change tracking.Id that live inside other entities.
Id, ToString and optional concurrency control
enum table.enums but can be declared in different types.Entity.At the very root we find the Modifiable class, inheriting from object. It's not even an entity, in fact it's so abstract that it's a hard to explain. It's the base class for anything that can be saved and provides change tracking. Even MList<T> and Lite<T> inherit from this Modifiable.
Basically Modifiable contains the property Modified of type ModifiedState.
Modifiable defines the PreSaving and PostRetriving virtual methods, that will be called just before saving an object and just after retrieving it.
Also, Modifiable has an important role on Entity Graphs.
The simplest entity possible. Your entities shouldn't inherit from ModifiableEntity directly.
ModifiableEntity implements Modifiable.Modified by checking if some fields was modified. To do so, it exposes the protected Set method.
ModifiableEntity also implements IDataErrorInfo and provides the basic plumbing for Validation.
Base class to be used when you want an entity to be embedded inside of the holders Entity. Small entities like Interval, SocialSecurityNumber, Color, GpsLocation or Address could inherit from here.
In the current implementation, this class adds nothing over ModifiableEntity. Instead it's just a marker class to make it easier to remember what to subclass when you want Embedded behavior.
On the database, embedded fields are stored in the parent entity table. Let's see an example:
PersonEntity class has an EmbeddedEntity of type AddressEntity with name HomeAddress.AddressEntity has a field Street.PersonEntity table will have a column with name HomeAddress_Street.Since EmbeddedEntity is a classes (reference types), by default they are nullable in the database as well, in order to reduce type-mismatch. This behavior is implemented adding a HasValue column and forcing nullability to the remaining embedded fields.
Most of the time this behavior is unnecessary. You can remove it using [NotNullableAttribute] in your EmbeddedEntity field.
Model entities are entities not meant to be stored in the database, just used as ViewModels for complex windows/webs that do not map exactly to the database, or temporal dialog that could be passed as a parameter to operations.
Currently they inherit from EmbeddedEntity for simplicity, but they are not an embedded entity.
ModelEntity also has all the powerful validation/change-notification/change-tracking features from ModifiableEntity-
This is the base entity with its own table. It also has:
Id field of type PrimaryKey. The property throws a InvalidOperationExeption if the entity is null.IdOrNull property of type PrimaryKey? witch return null if the entity is new.IsNew property that returns true when the entity is new.ToStringProperty that evaluates ToString bus can be invalidated. Useful for binding.ToStr column with the evaluation of ToString before saving if ToStringExpression is not defined.Equals and GetHashCode to depend on the Id and Type, not in reference equality.Mixins.Classes inheriting from Entity also need to provide and EntityKindAttribute.
Additionally, Entity also contains optional concurrency support using Ticks field that stores the current version of the entity. The actual value is just DateTime.Now.Ticks of the moment the entity is saved.
Each time we Save an entity we also update the Ticks value.
Also, while saving a modified entity, we test if the Ticks value of the entity is not the same as the one in the database. If that would happen, an exception will be thrown and the transaction will be rollbacked.
When modifying a MList<T> only the necessary commands (INSERT/DELETE/UPDATE) are sent to the database. Applying this changes to an entity different than the one in-memory will create a corrupt state, that's why MList<T> fields can only be part of entities with Ticks
You can disable concurrency control by applying TicksAttribute(false) to the type. This is usefull for simple types created by the Synchronizer, like Enums, Symbols or your own run-time modifiable enumerated types: TypeOfCustomer, Country, State, etc...
because these classes don't have concurrency problems (they are rarely modified) and they don't have MList<T>.
Apart from these features, it implements the IEntity interface, which is just a marker interface in case you want to use ImplementedBy or ImplmentedByAll over interfaces. See more about Inheritance.
This interface is only implemented by Entity class and should be inherited by any interface that will be used by Polymorphic Foreign Key. For example:
public interface IProcessDataEntity : IEntity
{
}By using an interface inheriting from IEntity, instead of a class inheriting from Entity, implementers are free to inherit from the class they want.
© Signum Software. All Rights Reserved.
Powered by Signum Framework