---
title: Product variants
slug: commerce-connect-15/docs/product-variants
docTags: 
createdAt: 2026-07-30T20:34:43.000Z
---

The `EPiServer.Commerce.Catalog.Linking.ProductVariation` class represents a relation between a product and a variant. To administer those relations, use `EPiServer.Commerce.Catalog.Linking.IRelationRepository` service.

The `Child` property of the `ProductVariation` contains the `ContentReference` of the variant. The class also has a `SortOrder` property, which describes the order of the variants, and a `GroupName` property for grouping variants. The `Quantity` property is not used for variants. `EPiServer.Commerce.Catalog.Linking.EntryRelation` contains default values that can be used: `DefaultGroupName` and `DefaultQuantity`.

A `ProductVariation` is uniquely defined by the `ContentReference` in its `Child` property together with its `Parent` property (referencing the product that has the variant). That is, the same variant cannot be added to a product more than once.

## Get a product's variants

Call the `GetChildren` method of `IRelationRepository` with the `ContentReference` of a product to get the following variants.

```csharp
public IEnumerable<ProductVariation> ListVariations(ContentReference referenceToProduct)
{
  var relationRepository = ServiceLocator.Current.GetInstance<IRelationRepository>();
  var variations = relationRepository.GetChildren<ProductVariation>(referenceToProduct);
  return variations;
}
```

To get the following products, call the `GetParents` method of `ILinksRepository` with the `ContentReference` of a variant:

```csharp
public IEnumerable<ProductVariation> GetProductByVariant(ContentReference variation)
{
  var relationRepository = ServiceLocator.Current.GetInstance<IRelationRepository>();
  var products = relationRepository.GetParents<ProductVariation>(variation);
  return products;
}
```

Or, get a variant's parent product by using entry content extensions:

```csharp
public IEnumerable<ContentReference> ListParentProduct(EntryContentBase entryContent)
{
  var parentProductLinks = entryContent.GetParentProducts();
  return parentProductLinks;
}
```

## Add a variant to a product

Use the `UpdateRelation` method or extension method of `IRelationRepository` to add `ProductVariation` objects to a product. The new variant must have a `Parent ContentReference` and a `Child ContentReference`.

```csharp
public void AddVariation(ContentReference referenceToProduct, ContentReference referenceToVariation)
{
  var relationRepository = ServiceLocator.Current.GetInstance<IRelationRepository>();
  var newVariation = new ProductVariation
    {
      SortOrder = 100,
      Parent = referenceToProduct,
      Child = referenceToVariation
    };
  relationRepository.UpdateRelation(newVariation);
}
```

## Remove a variant from a product

To remove a variant from a product, call the `RemoveRelation` method or extension method of `IRelationRepository`, with a `ProductVariation` object matching an existing variant. You can either construct a matching object, or use `GetParents` to get the existing **Relations**, filter out the object you want to remove, and pass it to `RemoveRelation`.

```csharp
public void RemoveVariation(ContentReference referenceToProduct, ContentReference referenceToVariation)
{
  var relationRepository = ServiceLocator.Current.GetInstance<IRelationRepository>();
    
  // Define a relation matching the one to remove, or use
  // GetRelations to find the one you want to remove and pass that to
  // RemoveRelation
  var relationToRemove = new ProductVariation
    {
      Parent = referenceToProduct,
      Child = referenceToVariation
    };
    
  // Removes matching ProductVariation, or no action if no match exists
  relationRepository.RemoveRelation(relationToRemove);
}
```
