Metadata Plus
MDP lets you extend any system object with a series of meta-fields. It is similar to object-oriented programming. For example, in object-oriented programming, you can create a base Order class, and then a Purchase Order Type object called PurchaseOrder, which inherits its properties and adds specific fields.
The root meta-class is based on a database table called system meta-class. Consider that an abstract meta-class which you must extend to use when associating extended new attributes with a new meta-class. Order becomes a system meta-class, and PurchaseOrder becomes a meta-class that you can extend.
The instance of the meta-class that holds values is called meta-object.
Name | Description |
|---|---|
Binary | MSSQL Common Type |
Bit | MSSQL Common Type |
Char | MSSQL Common Type |
DateTime | MSSQL Common Type |
Decimal | MSSQL Common Type |
Float | MSSQL Common Type |
Image | MSSQL Common Type |
Int | MSSQL Common Type |
Money | MSSQL Common Type |
NChar | MSSQL Common Type |
NText | MSSQL Common Type |
NVarChar | MSSQL Common Type |
Real | MSSQL Common Type |
UniqueIdentifier | MSSQL Common Type |
SmallDateTime | MSSQL Common Type |
SmallInt | MSSQL Common Type |
SmallMoney | MSSQL Common Type |
Text | MSSQL Common Type |
Timestamp | MSSQL Common Type |
TinyInt | MSSQL Common Type |
VarBinary | MSSQL Common Type |
VarChar | MSSQL Common Type |
Variant | MSSQL Common Type |
Numeric | MSSQL Common Type |
Sysname | MSSQL Common Type |
Integer | Metadata Type |
Boolean | Metadata Type |
Date | Metadata Type |
Metadata Type | |
URL | Metadata Type |
ShortString | Metadata Type |
LongString | Metadata Type |
LongHtmlString | Metadata Type |
DictionarySingleValue | Metadata Type |
DictionaryMultiValue | Metadata Type |
EnumSingleValue | Metadata Type |
EnumMultiValue | Metadata Type |
StringDictionary | Metadata Type |
File | Metadata Type |
ImageFile | Metadata Type |
MetaObject | Metadata Type |
Not all properties have a visual designer associated with them, but you can use all of them to extend the meta-class.
The MDP is designed to give the resulting database structure the fastest performance. When a meta-class is created, the container data table and history tables are created with a corresponding set of stored procedures and full text indexes (if full text functionality is enabled). The appropriate indexes are also put.
Meta-fields and Meta-classes
Meta-fields
Meta-fields describe different properties associated with an element inside Optimizely Customized Commerce. You can create a meta-field of any type supported by Metadata Plus.
Meta-classes
Customized Commerce uses meta-classes to describe different types of elements, such as Categories and Products, that are used in the creation and extension of the Customized Commerce solutions developed. Meta-class is a collection of meta-fields. The following types of meta-classes are defined:
- Mediachase.MetaDataPlus.System. Used for the built-in OrderGroup elements of Customized Commerce.
- Mediachase.MetaDataPlus.User. Created when a user defines a new meta-class for a OrderGroup. It is always an extension of one the existing System meta-classes.
Use meta-classes and meta-fields
It is important to understand the concepts of a meta-class and meta-field, which form the basis for purchase orders and subscriptions, to fully understand how they work within Optimizely Customized Commerce. For a better understanding, consider an example of creating a new order type WorkOrder which has the following properties:
- Hours
- Matrials
- Bid
- FinalPrice
To duplicate this product inside your solution, create a WorkOrder meta-class with the OrderGroup meta-class as its parent. In this example, WorkOrder is of type Mediachase.MetaDataPlus.User, and the built-in OrderGroup meta-class is of type Mediachase.MetaDataPlus.System.
Next, assign the properties to your WorkOrderClass by creating a meta-attribute for each Property, then assigning them to your WorkOrderClass. For example, the Hours property could be a meta-attribute of type Integer, and FinalPrice can be a meta-attribute of type money. After you create these meta-attributes, assign them to your WorkOrderClass.
Create meta-fields
Mediachase.MetaDataPlus.Configurator.MetaField.Create(context: OrderContext.MetaDataContext,
metaNamespace: "Mediachase.Commerce.Orders.User",
name: "BidPrice",
friendlyName: "Bid price",
description: "Bid Price",
dataType: MetaDataType.Decimal,
length: 17,
allowNulls: true,
multiLanguageValue: false,
allowSearch: false,
isEncrypted: false)Update meta-fields
var metaField = Mediachase.MetaDataPlus.Configurator.MetaField.Load(OrderContext.MetaDataContext, "BidPrice");
metaField.Description = "Better desciption";
metaField.OnUpdated();Delete meta-fields
var metaField = Mediachase.MetaDataPlus.Configurator.MetaField.Load(OrderContext.MetaDataContext, "BidPrice");
Mediachase.MetaDataPlus.Configurator.MetaField.Delete(OrderContext.MetaDataContext, metaField.Id);Create meta-classes
var orderGroupClass = Mediachase.MetaDataPlus.Configurator.MetaClass.Load(OrderContext.MetaDataContext, "OrderGroup");
var metaClass = Mediachase.MetaDataPlus.Configurator.MetaClass.Create(OrderContext.MetaDataContext, "WorkOrder", "Work Order", "WorkOrder", orderGroupClass, false, "Work Order" );Update meta-classes
var metaClass = Mediachase.MetaDataPlus.Configurator.MetaClass.Load(OrderContext.MetaDataContext, "WorkOrder");
metaClass.FriendlyName = "Work order change";Delete meta-classes
var metaClass = Mediachase.MetaDataPlus.Configurator.MetaClass.Load(OrderContext.MetaDataContext, "WorkOrder");
Mediachase.MetaDataPlus.Configurator.MetaClass.Delete(OrderContext.MetaDataContext, metaClass.Id);Add meta-felds to meta-classes
var metaClass = Mediachase.MetaDataPlus.Configurator.MetaClass.Load(OrderContext.MetaDataContext, "WorkOrder");
var metaField = Mediachase.MetaDataPlus.Configurator.MetaField.Load(OrderContext.MetaDataContext, "BidPrice") ?? Mediachase.MetaDataPlus.Configurator.MetaField.Create(
context: OrderContext.MetaDataContext,
metaNamespace: metaClass.Namespace,
name: "BidPrice",
friendlyName: "Bid Price",
description: "Bid Price",
dataType: MetaDataType.Decimal,
length: 17,
allowNulls: true,
multiLanguageValue: false,
allowSearch: false,
isEncrypted: false);
if (metaClass.MetaFields.All(x => x.Id != metaField.Id))
{
metaClass.AddField(metaField);
}
else if (!metaField.DataType.Equals(MetaDataType.Decimal))
{
metaClass.DeleteField(metaField.Name);
Mediachase.MetaDataPlus.Configurator.MetaField.Delete(OrderContext.MetaDataContext, metaField.Id);
metaField = Mediachase.MetaDataPlus.Configurator.MetaField.Create(context: OrderContext.MetaDataContext,
metaNamespace: metaClass.Namespace,
name: "BidPrice",
friendlyName: "Bid Price",
description: "Bid Price",
dataType: MetaDataType.Decimal,
length: 17,
allowNulls: true,
multiLanguageValue: false,
allowSearch: false,
isEncrypted: false);
metaClass.AddField(metaField);
}Remove meta-fields from meta-classes
var metaClass = Mediachase.MetaDataPlus.Configurator.MetaClass.Load(OrderContext.MetaDataContext, "WorkOrder");
metaClass.DeleteField("BidPrice");