Loading...
Area: Optimizely Commerce
Applies to versions: 14 and higher
Other versions:

Metadata Plus

Recommended reading 
Note: This documentation is for the preview version of the upcoming release of CMS 12/Commerce 14/Search & Navigation 14. Features included here might not be complete, and might be changed before becoming available in the public release. This documentation is provided for evaluation purposes only.

This topic describes Metadata Plus (MDP) 2.0, the underlying default storage engine for purchase orders and subsciptions in Optimizely Commerce. 

How it works

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
Email 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 data fields and classes

Meta-fields

Meta-fields describe different properties associated with an element inside Optimizely Commerce. You can create a meta-field of any type supported by Metadata Plus.

Meta-classes

Optimizely 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 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 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.

Using 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 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.

Configuring meta-classes and meta-fields

Creating 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)

Updating meta-fields

var metaField = Mediachase.MetaDataPlus.Configurator.MetaField.Load(OrderContext.MetaDataContext, "BidPrice");
metaField.Description = "Better desciption";
metaField.OnUpdated();

Deleting meta-fields

var metaField = Mediachase.MetaDataPlus.Configurator.MetaField.Load(OrderContext.MetaDataContext, "BidPrice");
Mediachase.MetaDataPlus.Configurator.MetaField.Delete(OrderContext.MetaDataContext, metaField.Id);

Creating 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" );

Updating meta-classes

var metaClass = Mediachase.MetaDataPlus.Configurator.MetaClass.Load(OrderContext.MetaDataContext, "WorkOrder");
metaClass.FriendlyName = "Work order change";

Deleting meta-classes

var metaClass = Mediachase.MetaDataPlus.Configurator.MetaClass.Load(OrderContext.MetaDataContext, "WorkOrder");
Mediachase.MetaDataPlus.Configurator.MetaClass.Delete(OrderContext.MetaDataContext, metaClass.Id);

Adding 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);
}

Removing meta-fields from meta-classes

var metaClass = Mediachase.MetaDataPlus.Configurator.MetaClass.Load(OrderContext.MetaDataContext, "WorkOrder");
metaClass.DeleteField("BidPrice");

Related topics

Do you find this information helpful? Please log in to provide feedback.

Last updated: Jul 02, 2021

Recommended reading