| name | mdl-entities |
| description | Complete MDL syntax reference for creating entities, attributes, associations, enumerations, and view entities |
| compatibility | opencode |
Domain model syntax expert for Mendix MDL. Covers persistent entities, non-persistent entities, view entities, attributes, associations, enumerations, and indexes.
Complete syntax reference for creating entities, attributes, and associations in MDL.
- Create persistent, non-persistent, or view entities
- Define attributes, associations, or enumerations
- Set up entity inheritance (generalization)
- Create domain model from requirements
<entity_types>
| Type | Keyword | Stored in DB | Use Case |
|---|
| Persistent | create persistent entity | Yes | Business data |
| Non-Persistent | create non-persistent entity | No | Temporary/view data |
| View | create view entity | No (OQL query) | Aggregated/computed data |
| </entity_types> | | | |
<persistent_entity>
/**
* Customer entity for storing customer data
*/
create persistent entity Module.Customer (
-- String attributes
Name: string(100) not null,
Email: string(200),
Code: string(20) unique,
-- Numeric attributes
Age: integer,
CreditLimit: decimal,
-- Boolean
IsActive: boolean default true,
-- Date/Time
CreatedDate: datetime,
BirthDate: date,
-- Enumeration
status: Module.CustomerStatus default Active,
-- Auto-number
CustomerNumber: autonumber
);
/
</persistent_entity>
<non_persistent_entity>
Used for temporary data, form parameters, or calculated values.
/**
* Search parameters for customer search form
*/
create non-persistent entity Module.CustomerSearchParams (
SearchName: string(100),
SearchEmail: string(200),
MinCreditLimit: decimal,
IncludeInactive: boolean default false
);
/
</non_persistent_entity>
<attribute_types>
| Type | Syntax | Example |
|---|
| String | Name: string(length) | Name: string(100) |
| Integer | Name: integer | count: integer |
| Long | Name: long | BigNumber: long |
| Decimal | Name: decimal | Amount: decimal |
| Boolean | Name: boolean | IsActive: boolean |
| DateTime | Name: datetime | CreatedAt: datetime |
| Date | Name: date | BirthDate: date |
| Enumeration | Name: Module.EnumName | status: Module.Status |
| AutoNumber | Name: autonumber | Code: autonumber |
| Binary | Name: binary | FileData: binary |
| Hashed String | Name: hashedstring | password: hashedstring |
| </attribute_types> | | |
<attribute_modifiers>
| Modifier | Meaning | Example |
|---|
not null | Required field | Name: string(100) not null |
unique | Unique constraint | Code: string(20) unique |
default value | Default value | IsActive: boolean default true |
Note: Boolean attributes auto-default to false when no default is specified.
</attribute_modifiers>
**CRITICAL: EXTENDS goes BEFORE the opening parenthesis, not after!**
/**
* Base entity
*/
create persistent entity Module.Person (
PersonName: string(100) not null,
Email: string(200)
);
/
/**
* Customer extends Person - EXTENDS before (
*/
create persistent entity Module.Customer extends Module.Person (
CustomerCode: string(20),
CreditLimit: decimal
);
/
Common parent entities for file/image storage:
-- Image entity (inherits Name, Size, Contents, thumbnail)
create persistent entity Module.ProductPhoto extends System.Image (
PhotoCaption: string(200),
SortOrder: integer default 0
);
-- File document (inherits Name, Size, Contents)
create persistent entity Module.Attachment extends System.FileDocument (
AttachmentDescription: string(500)
);
Wrong (parse error):
-- EXTENDS after ) = parse error!
create persistent entity Module.Photo (
PhotoCaption: string(200)
) extends System.Image;
### Reference (Many-to-One)
/**
* Order belongs to one Customer
*/
create association Module.Order_Customer (
PARENT Module.Customer,
CHILD Module.Order
);
/
Reference Set (Many-to-Many)
/**
* Product can be in many Categories
* Category can have many Products
*/
create association Module.Product_Category (
PARENT Module.Category as reference set,
CHILD Module.Product
);
/
Association with Delete Behavior
/**
* Delete orders when customer is deleted
*/
create association Module.Order_Customer (
PARENT Module.Customer,
CHILD Module.Order,
delete PARENT cascade -- Delete orders when customer deleted
);
/
Delete behaviors:
delete PARENT cascade - Delete children when parent deleted
delete PARENT prevent - Prevent deletion if children exist
delete CHILD cascade - Delete parent when last child deleted
```mdl
/**
* Order status values
*/
create enumeration Module.OrderStatus (
Draft = 'Draft',
Pending = 'Pending',
Approved = 'Approved',
Shipped = 'Shipped',
Delivered = 'Delivered',
Cancelled = 'Cancelled'
);
/
```
<view_entity>
/**
* Monthly sales summary by customer
*/
create view entity Module.CustomerSalesSummary (
CustomerName: string(100),
TotalOrders: integer,
TotalAmount: decimal,
LastOrderDate: datetime
)
as
select
c.Name as CustomerName,
count(o.OrderID) as TotalOrders,
sum(o.Amount) as TotalAmount,
max(o.OrderDate) as LastOrderDate
from Module.Customer c
left join c/Module.Order_Customer/Module.Order o
GROUP by c.Name;
/
</view_entity>
<entity_with_index>
/**
* Product with search index
*/
create persistent entity Module.Product (
Code: string(20) not null,
Name: string(100) not null,
Category: string(50),
Price: decimal
)
index idx_product_code on (Code)
index idx_product_category on (Category);
/
</entity_with_index>
<complete_domain_model_example>
-- Enumeration
create enumeration Shop.OrderStatus (
Draft = 'Draft',
Confirmed = 'Confirmed',
Shipped = 'Shipped',
Delivered = 'Delivered'
);
/
-- Customer entity
create persistent entity Shop.Customer (
Name: string(100) not null,
Email: string(200) not null unique,
Phone: string(20),
IsActive: boolean default true,
CreatedDate: datetime
);
/
-- Product entity
create persistent entity Shop.Product (
Code: string(20) not null unique,
Name: string(100) not null,
description: string(500),
Price: decimal not null,
Stock: integer default 0,
IsAvailable: boolean default true
);
/
-- Order entity
create persistent entity Shop.Order (
OrderNumber: autonumber,
OrderDate: datetime not null,
status: Shop.OrderStatus default Draft,
TotalAmount: decimal,
Notes: string(500)
);
/
-- Order line entity
create persistent entity Shop.OrderLine (
Quantity: integer not null,
UnitPrice: decimal not null,
LineTotal: decimal
);
/
-- Associations
create association Shop.Order_Customer (
PARENT Shop.Customer,
CHILD Shop.Order
);
/
create association Shop.OrderLine_Order (
PARENT Shop.Order,
CHILD Shop.OrderLine,
delete PARENT cascade
);
/
create association Shop.OrderLine_Product (
PARENT Shop.Product,
CHILD Shop.OrderLine
);
/
</complete_domain_model_example>
<quick_reference>
Entity Creation
create persistent entity Module.Name (attributes);
create non-persistent entity Module.Name (attributes);
create view entity Module.Name (attributes) as select ...;
Attribute Syntax
attributename: type [(length)] [not null] [unique] [default value]
Association Syntax
create association Module.Name (
PARENT Module.ParentEntity [as reference set],
CHILD Module.ChildEntity
[, delete PARENT cascade|prevent]
);
Enumeration Syntax
create enumeration Module.Name (
Value1 = 'Caption1',
Value2 = 'Caption2'
);
</quick_reference>
<output_rules>Output MDL code only in code blocks. Keep explanations concise.</output_rules>