Data Types
Data types control how property values are stored, validated, and displayed. Every [Property<T>] attribute references a data type as its generic parameter.
Type Hierarchy
DataTypeBase (abstract)
├── StringDataTypeBase
│ └── Text (max 100)
│ ├── IdText (max 15, uppercase, barcode-safe)
│ ├── MultilineText (unlimited)
│ ├── ProperNoun (max 50, auto title-case)
│ ├── Title (max 80)
│ ├── Email (max 50, validates format)
│ ├── Phone (max 25, auto-formats USA numbers)
│ ├── Url (max 500, validates URL)
│ └── Website (max 200, validates URL)
├── DecimalDataTypeBase
│ └── Decimal (2 stored / 2 visual decimals)
│ ├── Currency (2 decimals)
│ └── PositiveDecimal (2 decimals, rejects negative)
├── Boolean
│ └── DefaultTrueBoolean (defaults to true)
├── Integer
├── DateTime
├── DateOnly
└── Enum
Core String Types
| Type | CLR Type | Max Length | Auto-Correct | Validation |
|---|---|---|---|---|
Text |
string |
100 | Trims whitespace | — |
IdText |
string |
15 | Uppercases, removes non-barcode characters (Code 39) | — |
MultilineText |
string |
Unlimited | Trims whitespace | — |
ProperNoun |
string |
50 | Converts to Title Case | — |
Title |
string |
80 | Trims whitespace | — |
Email |
string |
50 | Trims whitespace | Validates email format |
Phone |
string |
25 | Formats USA 10-digit numbers to (XXX) XXX-XXXX, supports extensions |
— |
Url |
string |
500 | Trims whitespace | Validates URL format |
Website |
string |
200 | Trims whitespace | Validates URL format |
Global using alias
You may want to create a global alias in your model's project so your entity code can use DataTypes.* everywhere. This avoids naming conflicts and simplifies code.
Example project file setup:
<ItemGroup>
<Using Include="Benevia.Core.Events.DataTypes">
<Alias>DataTypes</Alias>
</Using>
</ItemGroup>
Usage
[Property<DataTypes.IdText>("SKU")]
public partial string Sku { get; set; }
[Property<DataTypes.ProperNoun>("Full name")]
public partial string FullName { get; set; }
[Property<DataTypes.Email>("Email")]
public partial string Email { get; set; }
[Property<DataTypes.MultilineText>("Notes")]
public partial string Notes { get; set; }
Core Numeric Types
| Type | CLR Type | Stored Decimals | Visual Decimals | Validation |
|---|---|---|---|---|
Decimal |
decimal |
2 | 2 | — |
Currency |
decimal |
2 | 2 | — |
PositiveDecimal |
decimal |
2 | 2 | Rejects values < 0 |
Integer |
int |
— | — | — |
Decimal types automatically round values to their stored precision.
Usage
[Property<DataTypes.Decimal>("Unit weight")]
public partial decimal UnitWeight { get; set; }
[Property<DataTypes.Currency>("Shipping")]
public partial decimal ShippingAmount { get; set; }
[Property<DataTypes.PositiveDecimal>("Factor")]
public partial decimal Factor { get; set; }
[Property<DataTypes.Integer>("Current Count")]
public partial int CurrentCount { get; set; }
Core Boolean Types
| Type | CLR Type | Default Value |
|---|---|---|
Boolean |
bool |
false |
DefaultTrueBoolean |
bool |
true |
Usage
[Property<DataTypes.Boolean>("Require integer quantities")]
public partial bool RequireIntegerQuantities { get; set; }
Core Date Types
| Type | CLR Type | Description |
|---|---|---|
DateOnly |
DateOnly? |
Date without time component |
DateTime |
DateTime? |
Date and time |
Usage
[Property<DataTypes.DateOnly>("Order date")]
public partial DateOnly? OrderDate { get; set; }
[Property<DataTypes.DateTime>("Closed date")]
public partial DateTime? ClosedDate { get; set; }
Enum Type
| Type | CLR Type | Description |
|---|---|---|
Enum |
Any C# enum |
Stores enum values by their underlying integer |
Usage
public enum SalesOrderStatus
{
Draft = 0,
Open = 1,
Fulfilled = 3,
Closed = 5
}
[Property<DataTypes.Enum>("Status")]
[DefaultValue(SalesOrderStatus.Open)]
public partial SalesOrderStatus Status { get; set; }
Create your own data types
These are custom data types defined in the ERP Model project for domain-specific needs. They demonstrate how to extend the type system (see Creating Data Types).
| Type | CLR Type | Stored Decimals | Visual Decimals | Defined In |
|---|---|---|---|---|
ProductQuantity |
decimal |
10 | 2 | Benevia.ERP.Model |
ProductUnitPrice |
decimal |
10 | 2 | Benevia.ERP.Model |
ProductUnitCost |
decimal |
10 | 2 | Benevia.ERP.Model |
| Type | CLR Type | Max Length | Defined In |
|---|---|---|---|
PriceFormula |
string |
75 | Benevia.ERP.Model |
UomName |
string |
10 | Benevia.ERP.Model |
Usage
[Property<ProductUnitPrice>("Cost")]
public partial decimal Cost { get; set; }
[Property<ProductQuantity>("Quantity (Each)")]
public partial decimal Quantity { get; set; }
Auto-Correct vs Validation
Data types can provide two kinds of behavior:
- Auto-correct runs immediately when a property is set. It transforms the value silently (e.g.,
IdTextuppercases,ProperNountitle-cases,Phonereformats digits). - Validation runs before save. It rejects invalid values with an error message (e.g.,
Emailchecks format,PositiveDecimalrejects negatives).
Both are implemented through the Events system in [Logic] classes associated with the data type.