-
Notifications
You must be signed in to change notification settings - Fork 3.2k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Mapping identity columns to enum properties no longer works in 2.1 #11970
Comments
@chrarnoldus This is an interesting pattern that I hadn't considered before--it's like you're making C# into ADA! The thing that changed here is that enums previously had ad-hoc conversions, but now are just a case of more general value converters. This means #11597 is now being hit in this case. We will consider this when working on that issue, but also leaving this open as a related bug since enums with no defined set of values may end up being a special case. I was able to workaround this by specifying my own converter and value generator: var converter = new ValueConverter<EntityId, int>(
v => (int)v,
v => (EntityId)v,
new ConverterMappingHints(valueGeneratorFactory: (p, t) => new TemporaryIntValueGenerator()));
modelBuilder
.Entity<Entity>()
.Property(p => p.EntityId)
.HasConversion(converter); (I actually didn't think this would work, but it seems to. If you use this approach and run into any issues then please let us know.) |
i get the same error for this following, is only int support, not long or ulong, that seems odd |
@roji Just wondering if this could be a factor - from the exception message: |
We've used that trick for a while, but it stopped working with 3.0. |
@space-alien SQL Server supports IDENTITY on bigint just fine. I've removed the long in my sample above to simplify that. |
Moving to backlog since this is dependent on #11597 |
I would love to see this feature coming back to EF Core 5.0. I'm no expert in how to implement this the best way, but I quickly came up with 2 approaches that might be viable:
The first option might provide more freedom to the developer (maybe having their own type that can be converted to/from int might help some?), while it might require more effort for each developer to "simply" convert between enum and int (creating custom converter and making use of it potentially for "all primary keys"). The second option might provide out of the box support (as in the past?), making it "easy" for anyone to opt in for Enum instead of e.g. Int. This is my preferred choice, but again: I'm not sure why support was removed in the first place, and there might be good reasons for this that makes this approach bad. Just a general note: Preferring enums over ints has really been helpful for me for several years and it feels like it will continue to be. Especially having a method with args like (int, int) can be annoying compared to (Enum1, Enum2). |
I'd like this feature too, though not for enums. I use an int value converter for all my ID types, and the IDs are wrapped in records to improve type safety:
This pattern is a very effective way to avoid a common class of bugs having to do with incorrect ID assignments, and provides a lot of documentation value. |
Fixes #11970 Also, add back in the provider-agnostic check for converters with value generators, but make it less restrictive.
Fixes #11970 Also, add back in the provider-agnostic check for converters with value generators, but make it less restrictive.
Fixes #11970 Also, add back in the provider-agnostic check for converters with value generators, but make it less restrictive.
@reinux What you're describing is a DDD Value Object, see my related issue here. Did you find a solution by upgrading to EF Core 6, or find some other workaround? |
In EF Core 2.0 it is possible to map an identity column in SQL Server to an enum property in C#. In EF Core 2.1 this no longer works and an exception is thrown (see details below). The reason we want use enum types rather than ints is to prevent mixing up identifiers of different entities.
Steps to reproduce
Code to reproduce the issue: https://github.com/chrarnoldus/EnumValueGeneratedOnAdd
Leaving the version on
2.0.3
and running the code, the programs prints the generated ids of the entities that were added, which is what I expect:When changing the version to
2.1.0-rc1-final
and running again, it crashes with the following exception:Is this something you would consider fixing? If not, is there another way to make this work?
Further technical details
EF Core version: 2.1.0-rc1-final
Database Provider: Microsoft.EntityFrameworkCore.SqlServer (SQL Server version doesn't seem to matter, tried 2016 LocalDB and 2017 Developer)
Operating system: Windows 10 1803
IDE: Visual Studio 2017 15.7.1
The text was updated successfully, but these errors were encountered: