Class ModelElement
Acts as the base class for metadata elements in the Time Cockpit data model.
Inheritance
Implements
Inherited Members
Namespace: TimeCockpit.Data.DataModel
Assembly: TimeCockpit.Data.dll
Syntax
public abstract class ModelElement : NamedDynamicObject, IDynamicMetaObjectProvider, INotifyPropertyChanged, IDataErrorInfo
Remarks
Time Cockpit supports a flexible data model that can be customized and extended by users. The metadata about
the data model is represented as a tree data structure. The type of every object in this tree must be derived
from ModelElement
.
Every element in the model element tree is identified using a universal unique identifier (see ElementGuid. Additionally every element has a name. This name needs not to be globally unique (e.g. two different entites can include properties with the same name). However, it has to be unique in the corresponding collection of model elements (e.g. element names of properties inside a single dimension must be unique inside that dimension).
Beside acting as the base class for model elements, ModelElement
also contains various
static helper functions and properties that can be used to check conventions (e.g.
IsValidIdentifier(String), etc.).
Important note to implementers: Note that ModelElement
instances can be created through deserialization.
Therefore make sure your fields are properly initialized. You cannot rely on your constructor being called neither
can you rely on fields initializers. If you have fields and/or properties that must be initialized you have to use
the System.Runtime.Serialization.OnDeserializingAttribute!
Constructors
ModelElement()
Initializes a new instance of the ModelElement class
Declaration
protected ModelElement()
ModelElement(IEnumerable<KeyValuePair<Object, Object>>)
Initializes a new instance of the ModelElement class.
Declaration
protected ModelElement(IEnumerable<KeyValuePair<object, object>> properties)
Parameters
Type | Name | Description |
---|---|---|
System.Collections.Generic.IEnumerable<System.Collections.Generic.KeyValuePair<System.Object, System.Object>> | properties | Collection of properties. |
Remarks
You can use this constructor to initialize a new instance of the ModelElement class by specifying its properties in a list of key/value pairs. This is especially useful for dynamic languages like python.
ModelElement(ModelElement)
Initializes a new instance of the ModelElement class.
Declaration
protected ModelElement(ModelElement element)
Parameters
Type | Name | Description |
---|---|---|
ModelElement | element | The element to copy. |
Remarks
Copy constructor for copying values of an instance of ModelElement.
Properties
Children
Gets the children of the ModelElement.
Declaration
public IEnumerable<ModelElement> Children { get; }
Property Value
Type | Description |
---|---|
System.Collections.Generic.IEnumerable<ModelElement> |
Remarks
When Attach(ModelElement) is called on a ModelElement, the modelelement that is to be attatched is added to the Children collection of Parent. Detach() removes modelelement from the Children collection of the Parent modelelement.
CreationVersion
Gets the creation version of the entity object
Declaration
public ulong CreationVersion { get; }
Property Value
Type | Description |
---|---|
System.UInt64 |
ElementGuid
Gets or sets the unique identifier for the model element.
Declaration
public Guid ElementGuid { get; set; }
Property Value
Type | Description |
---|---|
System.Guid |
Error
Gets an error message indicating why validation fails for this object.
Declaration
public string Error { get; }
Property Value
Type | Description |
---|---|
System.String |
ErrorSummary
Gets a summary of all validation errors that occurred in the ModelElement and its children model elements
Declaration
public IEnumerable<PropertyValidationMessage> ErrorSummary { get; }
Property Value
Type | Description |
---|---|
System.Collections.Generic.IEnumerable<PropertyValidationMessage> |
InvariantFriendlyName
Gets or sets a language invariant friendly name of the ModelElement
Declaration
public string InvariantFriendlyName { get; set; }
Property Value
Type | Description |
---|---|
System.String |
IsApplicationSpecificElement
Gets a value indicating whether the element is a application specific element.
Declaration
public bool IsApplicationSpecificElement { get; }
Property Value
Type | Description |
---|---|
System.Boolean |
IsFullPersistBehavior
Gets a value indicating whether the modelelement is persisted fully or not.
Declaration
public bool IsFullPersistBehavior { get; }
Property Value
Type | Description |
---|---|
System.Boolean |
IsNonePersistBehavior
Gets a value indicating whether the modelelement is PersistBehavior.None.
Declaration
public bool IsNonePersistBehavior { get; }
Property Value
Type | Description |
---|---|
System.Boolean |
Remarks
This property should be only user for string templating
IsSystemElement
Gets a value indicating whether the element is a system element.
Declaration
public bool IsSystemElement { get; }
Property Value
Type | Description |
---|---|
System.Boolean |
IsSystemOrApplicationSpecificElement
Gets a value indicating whether the element is a application specific or system element.
Declaration
public bool IsSystemOrApplicationSpecificElement { get; }
Property Value
Type | Description |
---|---|
System.Boolean |
IsUserElement
Gets a value indicating whether the element is a application specific element.
Declaration
public bool IsUserElement { get; }
Property Value
Type | Description |
---|---|
System.Boolean |
IsValid
Gets a value indicating whether the ModelElement is valid or not
Declaration
public bool IsValid { get; }
Property Value
Type | Description |
---|---|
System.Boolean |
LastUpdateVersion
Gets the update version of the entity object
Declaration
public ulong LastUpdateVersion { get; }
Property Value
Type | Description |
---|---|
System.UInt64 |
Name
Gets or sets the name of the model element.
Declaration
public override string Name { get; set; }
Property Value
Type | Description |
---|---|
System.String |
Overrides
Remarks
Note that once the model element has been added to a tree (e.g. by adding it to a parent object's collection) the name cannot be changed any more.
When the name is set and the name contains USR, SYS or APP, the ownership is set to the according value.
Exceptions
Type | Condition |
---|---|
System.InvalidOperationException | You tried to change the name once it has been set on a persisted model element. |
System.ArgumentException | Specified name is not a valid identifier. |
NonPrefixedName
Gets the name of the model element without its prefix.
Declaration
public string NonPrefixedName { get; }
Property Value
Type | Description |
---|---|
System.String |
Ownership
Gets or sets the ownership type of a model element.
Declaration
public Ownership Ownership { get; set; }
Property Value
Type | Description |
---|---|
Ownership |
Remarks
If the ownership for the current model element is Ownership.None, this property returns Ownership.User, as this ownership type is the specified default value for the ownership property.
The ownership property should be set before any properties, relations, validationrules or modelentityinterfaces are added to a modelentity. This is because, to a certain extent, the latter elements derive the ownership from their parent element. That is, if properties, relations etc. are added to a modelentity which is either System or User, properties, relations, etc. inherit the ownership from their parent.
When the ownership property is not set explicitely by the user, the system sets the ownership automatically to user. This behavior is especially important when using application specific elements. In contrast to system and user model entities which force their children to be of the same ownership as themselves, application specific entites can contain both, user and appspecific children. That is, they do not change the ownership of their children. When adding a property or relation to an applicationspecific entity without specifying the ownership of the property/relation, the property/relation will keep user as default ownership!
OwnershipPrefix
Gets the database prefix of the element
Declaration
public string OwnershipPrefix { get; }
Property Value
Type | Description |
---|---|
System.String |
Parent
Gets the parent element.
Declaration
public ModelElement Parent { get; }
Property Value
Type | Description |
---|---|
ModelElement |
Remarks
To set the parent of a given model element you have to use the function Attach(ModelElement). To remove the parent use Detach(). Parent is always null for detached model elements.
PersistBehavior
Gets or sets a value indicating whether the ModelElement
instance should be persisted in
the database.
Declaration
public virtual PersistBehavior PersistBehavior { get; set; }
Property Value
Type | Description |
---|---|
PersistBehavior |
Remarks
The default value for this property is langword_csharp_True.
You should use this property if you need to create temporary model elements. These objects should not result in changes in the database. Therefore they are marked as non-persistent.
Note that you have to set this property to false immediately after object creation if you do not want it to be stored in the database. Changing the property value to false at a later point in time only prevents further changes to the object to be written to the database. However, changing the value to false does never remove anything from the database that has been written before!
Methods
Accept(ModelElementVisitor)
Accepts a visitor dispatching the corresponding operation to the concrete type.
Declaration
public abstract void Accept(ModelElementVisitor visitor)
Parameters
Type | Name | Description |
---|---|---|
ModelElementVisitor | visitor | the visitor to accept. |
Attach(ModelElement)
Attaches a model element to a parent model element.
Declaration
protected virtual void Attach(ModelElement newParent)
Parameters
Type | Name | Description |
---|---|---|
ModelElement | newParent | Parent model element. |
Remarks
Note to implementers: If your model element has sub-elements, your implementation of Attach
should call the base class' implementation and afterwards attach all sub-elements.
Exceptions
Type | Condition |
---|---|
System.ArgumentNullException |
|
System.ArgumentException | Thrown in case of a recursion in the model element tree. |
Detach()
Detaches a model element from a parent model element.
Declaration
protected virtual void Detach()
Remarks
Note to implementers: If your model element has sub-elements your implementation of Detach should detach all sub-elements and afterwards call the base class' implementation.
If you call Detach
for a model element that has no parent the call is ignored. No
exception is thrown in this case.
IsValidIdentifier(String)
Can be used to check if an identifier is valid.
Declaration
public static bool IsValidIdentifier(string identifier)
Parameters
Type | Name | Description |
---|---|---|
System.String | identifier | Identifier to check. |
Returns
Type | Description |
---|---|
System.Boolean | langword_csharp_True indicates that the identifier is valid. langword_csharp_False means that the provided string value cannot be used as an identifier. |
Remarks
Identifiers in Time Cockpit must comply with the following rules:
- Must not be null or empty.
- Must start with an uppercase letter followed by a combination of upper/lowercase letters, digits or underscores.
- Must not be a reserved word.
- Must not start with a reserved identifier prefix.
- Length must be <= 64 characters.
OnDeserializing(StreamingContext)
Called whenever deserialization of the model element is happening
Declaration
[OnDeserializing]
public void OnDeserializing(StreamingContext context)
Parameters
Type | Name | Description |
---|---|---|
System.Runtime.Serialization.StreamingContext | context | Stream context used for deserialization. |
Remarks
This method is part of the internal infrastructure of the TimeCockpit.Data
and must not
be called from outside.
SetName(String)
Sets the name of an instance of ModelElement.
Declaration
protected void SetName(string value)
Parameters
Type | Name | Description |
---|---|---|
System.String | value | The value to set the name of a ModelElement to. |
SetOwnership(Ownership)
Sets the ownership of an instance of ModelElement.
Declaration
protected void SetOwnership(Ownership value)
Parameters
Type | Name | Description |
---|---|---|
Ownership | value | The value to set the ownership of a ModelElement to. |
SetOwnershipPrefix(String)
Sets the ownership of a model element according to a certain string prefix.
Declaration
protected void SetOwnershipPrefix(string prefix)
Parameters
Type | Name | Description |
---|---|---|
System.String | prefix | A string prefix to derive the ownership from. |
SetPersistBehavior(PersistBehavior)
Sets the persist behavior of the current ModelElement.
Declaration
protected virtual void SetPersistBehavior(PersistBehavior persistBehavior)
Parameters
Type | Name | Description |
---|---|---|
PersistBehavior | persistBehavior | The new persist behavior of the ModelElement. |
Remarks
This method's only purpose is to make it possible to override a ModelElement's persist behavior in the context of a memberwise clone
UpdateChildren(NotifyCollectionChangedEventArgs)
Attaches or detaches added or removed collection items.
Declaration
protected void UpdateChildren(NotifyCollectionChangedEventArgs e)
Parameters
Type | Name | Description |
---|---|---|
System.Collections.Specialized.NotifyCollectionChangedEventArgs | e | Provides data for the CollectionChanged event. |
Remarks
Quite frequently descendant classes will contain collections of child items (ModelCollection<T>).
These child items descend from ModelElement
, too. UpdateChildren
is typically used in descendant
classes to attach/detach ModelElement
instances that have been added/removed from such collections.
Validate(ref IList<PropertyValidationMessage>, Boolean)
Validates a ModelElement according to certain rules.
Declaration
protected virtual void Validate(ref IList<PropertyValidationMessage> messages, bool validateRecursively)
Parameters
Type | Name | Description |
---|---|---|
System.Collections.Generic.IList<PropertyValidationMessage> | messages | An list of strings that stores that picks up the validation errors of a model element. |
System.Boolean | validateRecursively | Indicates wheter to validate only the current model element or all its children (recursively) as well. |
Remarks
The rules the ModelElement is validated against are dependent on the type of ModelElement that is validated. This method can be overridden to provide custom validation behavior for subclasses of ModelElement
When Validate(ref IList<PropertyValidationMessage>, Boolean) is called on a modelelement, the Validate(ref IList<PropertyValidationMessage>, Boolean) method of all children attatched to the modelelemnt are validated recursivly.