Work with image column definitions using code

Use image columns to store image data. Image columns are optimized for storing binary data. Dataverse doesn't save this data in the relational data store, which improves performance and reduces the capacity usage. Learn more about storage capacity

A custom or customizable table can have zero or more image columns. This article is about working with column definitions in code. To use data stored in these columns, see Use image column data.

Create image columns

The recommended way to create image columns is to use Power Apps and define your columns using the designer. More information: Image Columns.

You can also create image columns using the Dataverse SDK for .NET or using the Web API. The following examples show how:

Use the ImageAttributeMetadata Class with the CreateAttributeRequest Class to create an image column.

public static void CreateImageColumn(IOrganizationService service, string entityLogicalName, string imageColumnSchemaName) {

    ImageAttributeMetadata imageColumn = new()
    {
        SchemaName = imageColumnSchemaName,
        DisplayName = new Label("Sample Image Column", 1033),
        RequiredLevel = new AttributeRequiredLevelManagedProperty(
                AttributeRequiredLevel.None),
        Description = new Label("Sample Image Column for ImageOperation samples", 1033),
        MaxSizeInKB = 30 * 1024, // 30 MB
        CanStoreFullImage = true

    };

    CreateAttributeRequest createimageColumnRequest = new() {
        EntityName = entityLogicalName,
        Attribute = imageColumn                   
    };

    service.Execute(createimageColumnRequest);

}

More information:

Update image columns

In addition to the properties inherited from the AttributeMetadata class | AttributeMetadata EntityType, you can also update the following properties of the ImageAttributeMetadata class | ImageAttributeMetadata EntityType.

Property Label Description
MaxSizeInKB Maximum image size Set this value to the smallest useable data size appropriate for your particular application. The default setting is 10240, or 10 MB. The maximum value is 30720 KB (30 MB). This value can't be changed in Power Apps using the designer after you create the image column, but you can change it using the API.
CanStoreFullImage Can store full images When this value is false, only thumbnail-sized images are available. Full images are stored in file storage on the Azure blob to reduce data storage consumption.

You can query the Image Attribute Configuration (AttributeImageConfig) table to find which image columns support full-sized images. More information: Detect which image columns support full-sized images
IsPrimaryImage Primary image column Whether the column is used to represent a table row in applications.

If there's only one image column for a table, this value is set by default. When another image column already exists for a table, this value is ignored if set to true when creating a new image column. However, you can update the column after you create it to make the new column the primary image column.

IsPrimaryImage can't be set to false, an exception is thrown if you try. You must choose another image column and set that IsPrimaryImage value to true.

If you delete a column that is the current primary image column, another image column for the table is selected automatically to be the current primary image column.

You can query the Entity Image Configuration (EntityImageConfig) table to know which image columns are the primary images for any table. More information: Primary Images

Note

The MaxHeight and MaxWidth values are always 144 and cannot be changed. These define the size of the thumbnail-sized images that are created for every image column value.

More information:

Retrieve image column definitions

Use these queries to retrieve image column definitions.

The static GetImageColumns method uses the RetrieveMetadataChangesRequest class to define a query to return details about all image columns in Dataverse or limited to a specific table.

The condition evaluated is whether the AttributeMetadata.AttributeTypeName property value equals AttributeTypeDisplayName.ImageType

/// <summary> 
/// Returns the image columns
/// </summary> 
/// <param name="service">The IOrganizationService</param> 
/// <param name="tableLogicalName">Optional filter by table logical name</param> 
static void GetImageColumns(IOrganizationService service, string tableLogicalName = "account") 
{ 
    // The Query definition 
    EntityQueryExpression entityQuery = new EntityQueryExpression() 
    {                 
        Properties = new MetadataPropertiesExpression("SchemaName","Attributes"), 
        AttributeQuery = new AttributeQueryExpression() 
        { 
            Properties = new MetadataPropertiesExpression( 
                "SchemaName", 
                "CanStoreFullImage", 
                "IsPrimaryImage", 
                "MaxSizeInKB") 
        } 
    }; 

    // Enable optional filtering by table logical name 
    if (!string.IsNullOrEmpty(tableLogicalName)){ 

        entityQuery.Criteria.Conditions.Add( 
            new MetadataConditionExpression( 
                propertyName: "LogicalName", 
                conditionOperator: MetadataConditionOperator.Equals, 
                value: tableLogicalName)); 
    } 

    // Only Image columns 
    entityQuery.AttributeQuery.Criteria.Conditions.Add( 
        new MetadataConditionExpression( 
            propertyName: "AttributeTypeName", 
            conditionOperator: MetadataConditionOperator.Equals, 
            value: AttributeTypeDisplayName.ImageType)); 


    // The request 
    RetrieveMetadataChangesRequest request = new RetrieveMetadataChangesRequest() {  
            Query = entityQuery 
    }; 

    // Send the request 
    var response = (RetrieveMetadataChangesResponse)service.Execute(request); 

    //Display the results: 
    response.EntityMetadata.ToList().ForEach(e => { 
        if (e.Attributes.Count() > 0) 
        { 
            Console.WriteLine($"Table: {e.SchemaName}"); 

            e.Attributes.ToList().ForEach(a => { 

                // To access image column properties 
                var  imageColumn = (ImageAttributeMetadata)a; 

                Console.WriteLine($"\t{a.SchemaName}"); 
                Console.WriteLine($"\t\tCanStoreFullImage:{imageColumn.CanStoreFullImage}"); 
                Console.WriteLine($"\t\tIsPrimaryImage:{imageColumn.IsPrimaryImage }"); 
                Console.WriteLine($"\t\tMaxSizeInKB:{imageColumn.MaxSizeInKB}"); 
            }); 

            Console.WriteLine(); 
        }             
    }); 
} 

More information: Query schema definitions

Restrictions with Customer Managed Keys (CMK)

The same restrictions that apply to file columns also apply to image columns configured to store full-sized images. More information: Restrictions with self-managed key (BYOK)

See also

Use image column data
Work with file column definitions using code
Sample: Image Operations using Dataverse SDK for .NET
Sample: Image Operations using Dataverse Web API