Source-backed EF Core mapping inventory for every persisted entity in the Asset bounded context — table mapping, Guid keys, required properties and lengths, enum-to-string conversions, owned value objects and collections, indexes, query filters, generated values, jsonb columns, and ignored members.
Backend engineers, database reviewers, architects, QA, support, operations, security reviewers, and product owners.
AssetDbContext configures seven persisted entities. The Asset aggregate root owns four value objects and two child collections; audit and timeline are infrastructure evidence entities; the outbox and processed-event tables are messaging infrastructure. All primary keys are Guids. Enum values are stored as strings, and three columns are jsonb.
| Aspect | Mapping |
|---|
| Table | Assets |
| Key | Guid Id, ValueGeneratedOnAdd (uuid factory-supplied at runtime) |
| Required properties | TenantId (int); AssetType varchar(120); Condition, Status; owned Code/Name/Serial/Assignee navigations required |
| Optional properties | TenantKey varchar(120); AssignedOnUtc timestamptz; ReturnDueDate timestamp; Notes varchar(2000); WorkflowInstanceId Guid |
| Enum → string | Status (AssetStatus) → varchar(40); Condition (AssetCondition) → varchar(40) |
| Owned values | AssetCode → AssetCode varchar(80); AssetName → AssetName varchar(200); SerialNumber → SerialNumber varchar(160); AssetAssignee → AssignedToUserId int?, LaborId int? |
| Owned collections | History — HasMany / WithOne / HasForeignKey(AssetId), cascade; Documents — HasMany / WithOne / HasForeignKey(AssetId), cascade |
| Indexes | UX_Assets_CompatId (unique), IX_Assets_AssetCode (non-unique), IX_Assets_Tenant_Status, IX_Assets_Tenant_Type, IX_Assets_WorkflowInstance |
| Query filter | Yes — `IsSuperAdmin |
| Generated values | CompatId int — DB identity at runtime (ValueGeneratedNever on backfill); Id Guid factory-supplied |
| jsonb | None on this table |
| Ignored | DomainEvents (Ignore); computed IsWorkflowManaged, IsDeletable not mapped |
AssetAssignmentHistory (child → AssetAssignmentHistory)
| Aspect | Mapping |
|---|
| Table | AssetAssignmentHistory |
| Key | Guid Id, ValueGeneratedNever (avoids phantom-Modified; nav-added rows insert) |
| Required properties | TenantId (int); AssetId (Guid, FK); Action varchar(60); Condition; Actor varchar(256), default system |
| Optional properties | UserId int?, LaborId int?; Notes varchar(2000); OccurredOnUtc timestamptz |
| Enum → string | Condition (AssetCondition) → varchar(40) |
| Owned values | None |
| Indexes | IX_AssetAssignmentHistory_AssetId (convention FK), IX_AssetHistory_Tenant_Asset (TenantId,AssetId) |
| Query filter | Yes |
| Generated values | Key not store-generated (append-only inserts) |
| jsonb | None |
| Ignored | None documented |
| Aspect | Mapping |
|---|
| Table | AssetDocumentReferences |
| Key | Guid Id, ValueGeneratedNever |
| Required properties | TenantId (int); AssetId (Guid, FK); DocumentType varchar(80); FileName varchar(400); StorageObjectKey varchar(500); UploadedBy varchar(256); SizeBytes bigint; UploadedOnUtc |
| Optional properties | ContentType varchar(160); DocumentServiceId Guid?; StorageObjectId Guid?; Sha256 varchar(128) |
| Enum → string | None |
| Owned values | None |
| Indexes | IX_AssetDocumentReferences_AssetId (convention FK), IX_AssetDocuments_Tenant_Asset (TenantId,AssetId) |
| Query filter | Yes |
| Generated values | Key not store-generated |
| jsonb | None |
| Ignored | Computed HasStoredContent not mapped |
| Aspect | Mapping |
|---|
| Table | AssetAuditLogs |
| Key | Guid Id |
| Required properties | TenantId (int); EntityType varchar(120); EntityId varchar(80) — string reference, not a FK; Action varchar(120); ActorEmail varchar(256), default system; OccurredAtUtc |
| Optional properties | DetailsJson |
| Enum → string | None |
| Indexes | IX_AssetAuditLogs_TenantId_OccurredAtUtc (TenantId,OccurredAtUtc) |
| Query filter | Yes |
| jsonb | DetailsJson |
| Ignored | None documented |
| Aspect | Mapping |
|---|
| Table | AssetTimeline |
| Key | Guid Id |
| Required properties | TenantId (int); EntityType varchar(120); EntityId varchar(80); EntryType varchar(80); Category varchar(60), default Asset; Actor varchar(256); OccurredAtUtc |
| Optional properties | Description varchar(2000); MetadataJson |
| Indexes | IX_AssetTimeline_Tenant_Occurred (TenantId,OccurredAtUtc) |
| Query filter | Yes |
| jsonb | MetadataJson |
| Ignored | None documented |
| Aspect | Mapping |
|---|
| Table | ProcessedIntegrationEvents |
| Key | Guid Id |
| Required properties | EventId Guid; EventType varchar(160); SourceService varchar(120); Outcome varchar(40), default Processed; ProcessedOnUtc |
| Optional properties | TenantId int?; CorrelationId varchar(160) |
| Indexes | UX_ProcessedEvents_EventId (unique) |
| Query filter | No |
| jsonb | None |
| Ignored | None documented |
| Aspect | Mapping |
|---|
| Table | OutboxMessages |
| Key | Guid Id |
| Required properties | EventId Guid; EventType varchar(160); PayloadJson; OccurredAtUtc; Status varchar(40); RetryCount int; SourceService varchar(120) |
| Optional properties | ProcessedOnUtc; ErrorMessage varchar(1000); CorrelationId varchar(120); TenantId Guid? (envelope tenant, null for asset events) |
| Indexes | IX_OutboxMessages_EventId (unique), IX_OutboxMessages_Status_OccurredAtUtc (Status,OccurredAtUtc) |
| Query filter | No |
| jsonb | PayloadJson |
| Ignored | None documented |
Implemented EF Core mappings with a Transitional compatibility surface.
Additional mapping hardening (for example database uniqueness on business codes, concurrency tokens) is not present in source and requires confirmation.
- Asset mappings
- Entity Mappings
- Entity mappings
microservices/src/asset-service/Infrastructure/AssetDbContext.cs
microservices/src/asset-service/Domain/Asset/Asset.cs
microservices/src/asset-service/Domain/Common/Enums.cs
microservices/src/asset-service/Infrastructure/Migrations/AssetDbContextModelSnapshot.cs
- Status: Draft
- Last reviewed: 2026-07-17
- Review cycle: Quarterly