When working with Entity Framework Core (EF Core), one of the small decisions that can have a significant impact is how you choose to store enums in your database.
By default, EF Core stores enums as integers. That’s fine for performance, but let’s be honest, seeing a 2 or 3 A database column doesn’t tell you much. What does 3 mean? "Shipped"? "Canceled"? You’d have to check the code to find out.
But what if, instead of 3, you could store "Shipped" directly? That’s where storing enums as strings comes in, and EF Core makes it surprisingly easy.
Why Bother Storing Enums as Strings?
It’s Just More Readable
When someone is reviewing the database, whether a support representative, analyst, or even you six months from now, a value like "Delivered" is immediately apparent. You don’t need to guess or cross-reference your codebase.
Easier Debugging and Maintenance
String values make logs, queries, and even reports easier to understand—no need to mentally decode what each number means.
Safer Long-Term
If you ever add or reorder enum members in your code, integer values can suddenly point to the wrong thing. Strings avoid this; the value stays the same regardless of its position in the enum.
How to Do It in EF Core?
Thankfully, EF Core provides a HasConversion() method that makes this process extremely straightforward.
👇 Step-by-Step Example
1. Define an enum
public enum OrderStatus
{
Pending,
Processing,
Shipped,
Delivered
}
2. Use it in your model
public class Order
{
public int Id { get; set; }
public OrderStatus Status { get; set; }
}
3. Add this to your DbContext
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Order>()
.Property(o => o.Status)
.HasConversion<string>();
}
That’s it. Now EF Core will store the enum values as strings, such as "Pending" or "Delivered", instead of numbers.
Real-World Example: E-commerce System
Let’s say you’re building an online store. You have an OrderStatus enum.
Pending , Paid , Packed , Shipped , Delivered , Cancelled .
Why does storing as strings help?
Anyone viewing the Orders table can understand the status without needing to dive into the code.
Support teams and analysts can filter and search the data more easily.
Even if you decide to insert a new status like Delayed , it won't mess up existing data.
When Not to Use Strings?
Let’s be fair — strings aren’t always the best choice.
High-Performance Systems
If you’re building something like a trading platform that stores millions of rows per day, those extra characters add up. Integers are faster to compare and take up less space.
Frequently Changing Enum Names
If you frequently rename your enum values (not just add new ones), string values can break things. The DB still retains the "OldValue" even after you rename it to "NewValue." Currently, there's a mismatch in the code.
Advanced: Custom Value Converters
Need a bit more control? EF Core lets you define custom converters.
var converter = new ValueConverter<OrderStatus, string>(
v => v.ToString(),
v => (OrderStatus)Enum.Parse(typeof(OrderStatus), v));
modelBuilder.Entity<Order>()
.Property(e => e.Status)
.HasConversion(converter);
This is handy if you want to localize, abbreviate, or format the string differently.
![]()
Summary
Pros of storing enums as strings.
Cons
Thank you for reading. Please share your questions, thoughts, or feedback in the comments section. I appreciate your feedback and encouragement.
Keep learning…!