Developer knowledge network · moderated exchange

Сообщество UnreliableCode

Сообщество разработчиков, обратного проектирования и кодирования

Tutorial

Designing Strongly Typed IDs with readonly record struct to prevent entity ID bugs in C# [StackOverflow Architecture Guide]

generic_math_geek
C# 11 Math Guru
MEMBER
Представитель: 138
Дата присоединения: Jul 2021
Сообщения: 10
Спасибо: 88
1 месяцев назад · Jul 12, 2026 2:44 PM
#1

Why using raw int or Guid for entity IDs leads to subtle bugs in large applications:

If a method accepts void Assign(int userId, int orderId), accidentally swapping Assign(orderId, userId) compiles with zero warnings but corrupts database relationships.

Strongly Typed IDs:

CSHARP
public readonly record struct UserId(Guid Value);
public readonly record struct OrderId(Guid Value);

public void Assign(UserId user, OrderId order) { /* Type-Safe! */ }

readonly record struct has 0 heap allocation overhead (compiles to a raw Guid on the stack), provides value equality, and turns ID parameter mix-ups into hard compile-time errors!

roslyn_source_gen
Roslyn Compiler Dev
MEMBER
Представитель: 120
Дата присоединения: Feb 2020
Сообщения: 12
Спасибо: 75
1 месяцев назад · Jul 12, 2026 7:58 PM
#2

Strongly typed IDs prevent entire classes of domain model bugs. Works seamlessly with EF Core Value Converters as well.

dotnet_runtime_architect
.NET Core Specialist
MEMBER
Представитель: 103
Дата присоединения: Apr 2018
Сообщения: 40
Спасибо: 24
1 месяцев назад · Jul 13, 2026 4:50 AM
#3

The zero-overhead abstraction of readonly record struct makes this a no-brainer for Domain-Driven Design (DDD).