cecilia@nansen.se
Jul 13, 2011
  10599
(6 votes)

An example using Business Foundation in EPiServer Commerce

The current EPiServer Commerce project I am working on has a requirement to allow logged-in customers to register products they have purchased, including those not purchased via the e-commerce site. They should then be able to see all of their registered products on their account page.

I decided to use the Business Foundation (BF) technology in EPiServer Commerce. You do this by creating a ‘Business Object’ in Commerce Admin, which you can read more about here.

My business object is called RegisteredProduct and contains two properties: CatalogEntryId and ContactId:


businessobject

The CatalogEntryId will hold the id of the product being registered (note that the product has to be in the e-commerce site catalog even if purchased elsewhere) and the ContactId holds the id of the logged-in customer registering the product.

In the code-behind for the ‘Register Products’ page, I have a method to create an instance of a RegisteredProduct BF object using the BusinessManager class. The properties are set from the values collected in the form and then the object is saved, again using the BusinessManager class:

 private void SaveRegisteredProduct()
 {
    var customerContact = CustomerContext.Current.CurrentContact;
    if (customerContact == null)
       return;

     // Creates an instance of your Business Object
     var registeredProduct = BusinessManager.InitializeEntity("RegisteredProduct");

     // Set values to properties in your Business Object
     registeredProduct.Properties["ContactId"].Value = 
          customerContact.PrimaryKeyId;
     registeredProduct.Properties["RegisteredProduct"].Value = 
          DropDownListProductModel.SelectedItem.Text;
     registeredProduct.Properties["CatalogEntryId"].Value = 
          int.Parse(DropDownListProductModel.SelectedValue);

     BusinessManager.Create(registeredProduct);
 }

To present a logged-in customer registered products, the BusinessManager’s List method is used. The method takes the name of the BF object type to query, the property to query on and a value to match against, in this case the logged-in customer’s id. Then for each RegisteredProduct object returned, the product can be read from the commerce catalog using the CatalogEntryId property as the key:

 private void ShowRegisteredProducts()
 {
     var customer = CustomerContext.Current.CurrentContact;
     if (customer == null)
         return;

     var registeredProducts = BusinessManager.List
        ("RegisteredProduct", new[] { FilterElement.EqualElement
        ("ContactId", customer.PrimaryKeyId) }).ToList();

     var entries = registeredProducts.Select
     (registeredProduct => CatalogContext.Current.GetCatalogEntry
     ((int) registeredProduct.Properties["CatalogEntryId"].Value)).ToList();

      RepeaterRegisteredProducts.DataSource = entries;
      RepeaterRegisteredProducts.DataBind();
 }

As I am new to EPiServer Commerce I don’t know if this is the best way to solve the problem. If anyone has an alternative solution then I welcome any feedback you have.

Jul 13, 2011

Comments

Sep 22, 2011 05:01 PM

This really helped me a lot, I got stuck on some specified cast exception stuff when creating the item, but now it works like a charm.
Many thanks!

/Fredrik von Werder

osbe
osbe Sep 29, 2011 11:23 AM

This is very useful and an excellent way of using Business Foundation, thanks for sharing this Cecilia!

Please login to comment.
Latest blogs
Graph access with only JS and Fetch

Postman is a popular tool for testing APIs. However, when testing an API like Optimizely Graph that I will be consuming in the front-end I prefer t...

Daniel Halse | Feb 4, 2026

Best Practices for Implementing Optimizely SaaS CMS: A Collective Wisdom Guide

This guide compiles collective insights and recommendations from Optimizely experts for implementing Optimizely SaaS CMS, focusing on achieving...

David Knipe | Feb 4, 2026 |

A day in the life of an Optimizely OMVP: Learning Optimizely Just Got Easier: Introducing the Optimizely Learning Centre

On the back of my last post about the Opti Graph Learning Centre, I am now happy to announce a revamped interactive learning platform that makes...

Graham Carr | Jan 31, 2026

Scheduled job for deleting content types and all related content

In my previous blog post which was about getting an overview of your sites content https://world.optimizely.com/blogs/Per-Nergard/Dates/2026/1/sche...

Per Nergård (MVP) | Jan 30, 2026