So far in this series, I showed how to use C# 9 records to declare strongly-typed ids as easily as this:
public record ProductId(int Value) : StronglyTypedId<int>(Value); I also explained how to make them work correctly with ASP.NET Core model binding and JSON serialization.
Today, I’ll present another piece of the puzzle: how to make Entity Framework core handle strongly-typed ids correctly.
Value conversion for a specific strongly-typed id Out of the box, EF Core doesn’t know anything about our strongly-typed ids.
In the previous post in this series, we noticed that the strongly-typed id was serialized to JSON in an unexpected way:
{ "id": { "value": 1 }, "name": "Apple", "unitPrice": 0.8 } When you think about it, it’s not really unexpected: the strongly-typed id is a “complex” object, not a primitive type, so it makes sense that it’s serialized as an object. But it’s clearly not what we want… Let’s see how to fix that.
Last time, I explained how easy it is to use C# 9 record types as strongly-typed ids:
public record ProductId(int Value); But unfortunately, we’re not quite done yet: there are a few issues to fix before our strongly-typed ids are really usable. For instance, ASP.NET Core doesn’t know how to handle them in route parameters or query string parameters. In this post, I’ll show how to address this issue.
Model binding of route and query string parameters Let’s say we have an entity like this:
Strongly-typed ids Entities typically have integer, GUID or string ids, because those types are supported directly by databases. However, if all your entities have ids of the same type, it becomes pretty easy to mix them up, and use the id of a Product where the id of an Order was expected. This is actually a pretty common source of bugs.
public void AddProductToOrder(int orderId, int productId, int count) { .