Create elastic tables using code
By using Power Apps, you can create and edit elastic tables without writing code.
However, it's sometimes useful to use code to create and update table definitions. The following examples show how to use the Dataverse SDK for .NET and Web API to create a new elastic table that has the schema name contoso_SensorData
. To create an elastic table through code, use the EntityMetadata.TableType
property with a value of Elastic
. If you don't set TableType
, the default value Standard
is used, and a standard table is created.
public static CreateEntityResponse CreateElasticTable(IOrganizationService service)
{
var request = new CreateEntityRequest
{
// Define table properties
Entity = new EntityMetadata
{
SchemaName = "contoso_SensorData",
DisplayName = new Label("SensorData", 1033),
DisplayCollectionName = new Label("SensorData", 1033),
Description = new Label("Stores IoT data emitted from devices", 1033),
OwnershipType = OwnershipTypes.UserOwned,
TableType = "Elastic",
IsActivity = false,
CanCreateCharts = new Microsoft.Xrm.Sdk.BooleanManagedProperty(false)
},
// Define the primary attribute for the entity
PrimaryAttribute = new StringAttributeMetadata
{
SchemaName = "contoso_SensorType",
RequiredLevel = new AttributeRequiredLevelManagedProperty(AttributeRequiredLevel.None),
MaxLength = 100,
FormatName = StringFormatName.Text,
DisplayName = new Label("Sensor Type", 1033),
Description = new Label("Type of sensor emitting data", 1033)
}
};
return (CreateEntityResponse)service.Execute(request);
}
CreateEntityResponse has these properties:
- AttributeId: The ID of the
contoso_SensorType
primary name string column. - EntityId: The ID of the
contoso_SensorData
table.
Learn more about creating custom tables using the SDK for .NET.
Adding columns
By using Power Apps, you can create columns in elastic tables without writing code.
You can also create columns by using the SDK or Web API. However, there are limits on the types of columns that you can add. Currently, you can't add the following types of columns:
- Money (
MoneyAttributeMetadata
) - MultiSelectPicklist (
MultiSelectPicklistAttributeMetadata
) - State (
StateAttributeMetadata
) - Status (
StatusAttributeMetadata
) - Image (
ImageAttributeMetadata
) - Calculated, Rollup, or Formula Columns
Elastic tables support string columns that store JavaScript Object Notation (JSON) data.
Create a column with JSON format
This example creates a contoso_SensorValue
string column with JSON format in the contoso_SensorData
elastic table. For cases where a large amount of JSON data must be stored, you can use the MemoAttributeMetadata
column type with JSON format instead of using the StringAttributeMetadata
column type.
This function creates a StringAttributeMetadata column by using the CreateAttributeRequest class.
public static Guid CreateJsonAttribute(IOrganizationService service)
{
var request = new CreateAttributeRequest
{
EntityName = "contoso_sensordata",
Attribute = new StringAttributeMetadata
{
SchemaName = "contoso_EnergyConsumption",
RequiredLevel = new AttributeRequiredLevelManagedProperty(AttributeRequiredLevel.None),
MaxLength = 1000,
FormatName = StringFormatName.Json,
DisplayName = new Label("Energy Consumption", 1033),
Description = new Label("Contains information about energy consumed by the IoT devices", 1033)
},
SolutionUniqueName = "examplesolution"
};
var response = (CreateAttributeResponse)service.Execute(request);
return response.AttributeId;
}
For more information, go to Add a String column to the custom table.
Alternate keys
You can't create custom alternate keys for elastic tables.
Each elastic table is created with one alternate key that uses these values:
- Display Name: Entity key for NoSql Entity that contains PrimaryKey and PartitionId attributes
- Name:
KeyForNoSqlEntityWithPKPartitionId
- LogicalName:
keyfornosqlentitywithpkpartitionid
This alternate key has the key values <table primary key name>
and partitionid
.
If you must reference a record where a partitionid
value is set, you can reference it by using this alternate key.
Learn how to use an alternate key to reference a record.
Adding relationships
Dataverse currently doesn't support creating many-to-many relationships with elastic tables.
One-to-many relationships are supported for elastic tables with the following limitations:
Cascading isn't supported. Cascading behavior must be set to
Cascade.None
when the relationship is created.Formatted values for lookup columns aren't returned when the following conditions are true:
- The table that is retrieved is a standard table, and the lookup refers to an elastic table.
- You're using a custom elastic table
partitionid
value. In other words, thepartitionid
value is set to something other than the default value (null). Learn how to choose a partitionid value.
Elastic tables support one-to-many relationships, and related rows can be retrieved when a record is retrieved. Related records can't be included in a query. Learn how to return related rows in a query.
Partitionid value column on referencing table
When you create a many-to-one relationship on a table that refers to an elastic table, a lookup column is created on the referencing table as you would expect.
At the same time, a string column is created that follows this naming convention <lookup name>pid
. This column stores the partitionid
value for the related elastic table record.
The <lookup name>pid
column value is set automatically when you use the elastic table alternate key to set the lookup column. Learn to associate elastic table records
If you are not using a partitioning strategy for your elastic table, the value for this <lookup name>pid
column is null, and you shouldn't change it after the record is created.
If you are using a partitioning strategy for your elastic table, and you want to retrieve the related elastic table record, you can't rely on the value of the lookup column alone. You must also include the partitionid
value from the <lookup name>pid
column to uniquely identify the related table. Learn more about partitioning and horizontal scaling
Next steps
See also
Elastic tables for developers
Query JSON columns in elastic tables
Use bulk operation messages
Elastic table sample code