Skip to main content

Business Central Dataverse Mapping Generator

Generates AL event subscriber code to wire up Dataverse/CDS integration synchronization. Covers both custom entities (full mapping setup) and OOB entities (extra field mappings on standard CRM tables).

Prerequisites​

  • CDS table exists in src/Table/ (TableType = CDS) or is a standard CRM table from the base application
  • For custom entities: corresponding BC table and CDS list page exist
  • Codeunits BCS Dataverse Events (70001) and BCS Dataverse Support Funct. (70002) exist
  • Permission set updated with table permissions

Step 1: Determine Entity Type​

This is the critical first step. The entire workflow differs based on entity type.

IF the CDS table has TableType = CDS with ExternalName starting with "bcs_" or a custom prefix
AND the BC table is a NEW custom table (not Customer, Item, Contact, Vendor, etc.)
→ Use CUSTOM ENTITY path (read references/custom-entity-mapping.md)

IF the BC table is a STANDARD base-app table (Customer, Item, Contact, Vendor, Opportunity, etc.)
AND the CDS table is a standard CRM table (CRM Account, CRM Product, CRM Contact, CRM Opportunity)
OR you are adding custom Dataverse fields to an existing standard sync
→ Use OOB ENTITY path (read references/oob-entity-mapping.md)
CriteriaCustom EntityOOB Entity
Dataverse entityCustom (bcs_ prefix)Standard CRM entity
BC tableNew custom tableStandard BC table (Customer, Item, etc.)
CDS table sourceGenerated via ALTPGenAlready in base application
Event subscribersFull set (5 events + lookup)Only AddNewExtraFieldMappings
Table extensionNot neededYes — to add custom fields to standard BC table
Page extensionNot neededYes — to expose custom fields on standard pages
Reference filereferences/custom-entity-mapping.mdreferences/oob-entity-mapping.md

Step 2: Read the Appropriate Reference​

Based on entity type, read the corresponding reference file for complete code patterns, examples, and step-by-step instructions:

  • Custom entity: Read references/custom-entity-mapping.md
  • OOB entity: Read references/oob-entity-mapping.md

Step 3: Gather Entity Information​

For Custom Entities​

  1. BC Table Name (e.g., "BCS Department")
  2. CDS Table Name (e.g., "BCS CDS bcs_department")
  3. Entity Logical Name (e.g., "bcs_department")
  4. Primary Key Field (e.g., "bcs_departmentId")
  5. Field Mappings — BC field → CDS field with sync direction
  6. CDS List Page Name (e.g., "BCS CDS Departments")

For OOB Entities​

  1. Standard BC Table (e.g., Item, Customer, Contact)
  2. CRM Table (e.g., CRM Product, CRM Account, CRM Contact)
  3. New Fields — custom Dataverse fields to map (e.g., "bcs_countryid")
  4. Sync Direction per field
  5. Standard Page to extend (e.g., Item Card, Customer Card)

Field Mapping Direction Reference​

DirectionValueWhen to use
BidirectionalIntegrationFieldMapping.Direction::BidirectionalField updated from either system
To DataverseIntegrationFieldMapping.Direction::ToIntegrationTableBC is master for this field
From DataverseIntegrationFieldMapping.Direction::FromIntegrationTableDataverse is master for this field

Event Subscriber Summary​

Custom Entity — All 5 Required​

#EventCodeunitPurpose
1OnGetCDSTableNoCRM Setup DefaultsMaps BC table no. → CDS table no.
2OnLookupCRMTablesLookup CRM TablesRoutes lookup to support function
3OnAddEntityTableMappingCRM Setup DefaultsRegisters entity for coupling UI
4OnAfterResetConfigurationCDS Setup DefaultsCreates table + field mappings
5OnAfterAddExtraIntegrationFieldMappingsCDS Setup DefaultsAlready exists — no changes

Plus: Handle{Entity}Integration procedure, LookupCDS{Entity} procedure, Label declaration.

OOB Entity — Only Extra Field Mappings​

#ChangeLocation
1Add field mapping callAddNewExtraFieldMappings in Support Funct.
2Create table extensionsrc/Table Extension/ — new field on standard BC table
3Create page extensionsrc/Page Extension/ — expose field on standard page

No new event subscribers needed — base application handles core sync.

Validation Checklist​

Custom Entity​

  • Case added to HandleOnGetCDSTableNo
  • Case added to HandleOnLookupCRMTables
  • Entity registered in HandleOnAddEntityTableMapping
  • Handle{Entity}Integration procedure created with table + field mappings
  • Call added in HandleOnAfterResetConfiguration
  • Label declared for mapping name
  • LookupCDS{Entity} procedure added to support functions
  • CDS list page has SetCurrentlyCoupled{Entity} procedure

OOB Entity​

  • Table extension created with new field(s) in correct ID range
  • Field mapping added in AddNewExtraFieldMappings with CRM table guard
  • Page extension created to expose field(s)
  • Permission set updated
  • Mapping line commented with duplicate warning

Completion Output​

Dataverse mapping generated for {Entity}

Type: {Custom Entity | OOB Entity Extra Fields}
BC Table: "{BC Table Name}"
CDS Table: "{CDS Table Name}"

Modified files:
- src/Codeunit/BCSDataverseEvents.Codeunit.al
- src/Codeunit/BCSDataverseSupportFunct.Codeunit.al
{- src/Table Extension/{file} (if OOB)}
{- src/Page Extension/{file} (if OOB)}

Field mappings:
| BC Field | CDS Field | Direction |
|----------|-----------|-----------|
| {field} | {field} | {dir} |

Next steps:
- Build project (Ctrl+Shift+P → AL: Build)
- Reset Dataverse configuration (CDS Connection Setup → Reset Configuration)
- Run full synchronization to test