Skip to main content

How to Create a Custom Data Entity in Dynamics 365 Finance and Operations

 

Creating a Data Entity in Dynamics 365 Finance and Operations (D365FO) is essential for enabling data import/export, integrations, and public APIs. In this blog, we’ll walk through both the basic shortcut method and the advanced method for creating a custom Data Entity, using a table named MZNFRCustomTable as our example.

🧩 Step 1: Create a Custom Table

Start by creating a new table in your project.

  • Go to Solution Explorer → Right-click your project → Add New Item
  • Select Table under FinanceOperations > Data Model
  • Name it MZNFRCustomTable



🧱 Step 2: Add Fields to Your Table

Define the fields you need in your table. For example:

  • CustomerAccount
  • CustomerName
  • Currency
  • PaymentNote
  • Balance


 Step 3: Shortcut Method – Create Data Entity via Addins

Right-click on your table → AddinsCreate Data Entity

This method is quick but limited in customization.


❗ Common Error

If you haven’t created an index, you’ll get this error:

"The natural key for the table MZNFRCustomTable was not found."


🔧 Step 3.1: Fix – Create an Index

To resolve the error:

  • Right-click Indexes → Add a new index (e.g., CustomerAccountIdx)
  • Add the CustomerAccount field
  • Set:

  • Allow Duplicates = No
  • Alternate Key = Yes


✅ Step 3.2: Retry Add-ins Method

Once the index is configured, retry the Add-ins shortcut to create the Data Entity.

🧠 Step 4: Advanced Method – Full Control Over Data Entity

For better flexibility and control, use the advanced method.

  • Go to Solution Explorer → Right-click your project → Add New Item
  • Select Data Entity under FinanceOperations > Data Model
  • Name it MZNFRCustomTableEntity


🔗 Step 5: Specify Primary Datasource

In the wizard:

  • Set Primary Datasource to MZNFRCustomTable
  • Choose Entity Category (e.g., Master)
  • Enable:

  • Public API (optional)
  • Data Management capabilities

📋 Step 6: Select Fields

Choose which fields to include in your Data Entity.

✅ Step 7: Set Mandatory Fields

Use the IsMandatory checkbox to mark required fields.



🎉 Step 8: Finish and Verify

Click Next to complete the wizard. Open your Data Entity object and verify:

  • All selected fields are present
  • Mappings and metadata are correct


🔄 Step 9: Regenerate Staging Table (Important!)

If you make changes to your table or Data Entity later:

  • Right-click the Data Entity → Regenerate staging table

This ensures your changes are reflected in data import/export operations.

🏁 Conclusion

Creating a Data Entity in D365FO can be done quickly via Add-ins or more robustly through the advanced method. Always ensure your table has a proper index and remember to regenerate the staging table after changes.

This guide should help you streamline your development workflow and avoid common pitfalls. Happy coding!

Popular posts from this blog

Consuming an External REST API in Dynamics 365 Finance & Operations (X++) and Saving Data into a Custom Table

  Introduction In this blog, I will explain how I consumed an online REST API in Microsoft Dynamics 365 Finance & Operations (D365 FO) using X++ and CLR Interop , deserialized the JSON response using Data Contract classes , and finally stored the data in a custom table . This is a common real-world integration scenario where external systems expose data via REST APIs and D365 FO needs to consume and persist that data. For this demo, I used the following public REST API : API URL: https://api.restful-api.dev/objects Solution Overview The solution consists of four X++ classes : MZNFRConsumeRestAPI – Main logic class (API call, deserialization, DB insert) MZNFRConsumeRestAPIParentContract – Parent contract (wraps JSON list) MZNFRConsumeRestAPIHeaderContract – Header contract (id, name) MZNFRConsumeRestAPILinesContract – Child contract (nested data node) 📌 Class Structure Diagram API Response Structure The API returns a JSON array like this: [ { ...

Modified Field Method in X++

  In Dynamics 365 Finance and Operations, user experience is everything. If a user enters an ItemId , they shouldn't have to manually type the ItemName . We can automate this using the modifiedField override on the table level. The ModifiedField  method is a kernel method that triggers after a field's value has been changed. It's the perfect place to put logic for fetching related data or resetting dependent fields. The Implementation On your custom table MNZFRSalesLine , you will override the  ModifiedField  method. We use a switch  statement on the _fieldId parameter to ensure our code only runs when the ItemId is the field being touched. public void modifiedField(FieldId _fieldId) { super(_fieldId); switch (_fieldId) { case fieldNum(MNZFRSalesLine, ItemId): if (this.ItemId) { // Fetch the Item Name using the InventTable find method // inventTable.itemName() is a common helper method ...