Skip to content

Mapping identity columns to enum properties no longer works in 2.1 #11970

@chrarnoldus

Description

@chrarnoldus

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:

1
2
3
4
5
6
7
8
10

When changing the version to 2.1.0-rc1-final and running again, it crashes with the following exception:

Unhandled Exception: System.NotSupportedException: Value generation is not supported for property 'Entity.EntityId' because it has a 'EnumToNumberConverter<EntityId, int>' converter configured. Configure the property to not use value generation using 'ValueGenerated.Never' or 'DatabaseGeneratedOption.None' and specify explict values instead.
   at Microsoft.EntityFrameworkCore.ValueGeneration.ValueGeneratorSelector.CreateFromFactory(IProperty property, IEntityType entityType)
   at Microsoft.EntityFrameworkCore.ValueGeneration.ValueGeneratorSelector.<Select>b__6_0(IProperty p, IEntityType t)
   at Microsoft.EntityFrameworkCore.ValueGeneration.ValueGeneratorCache.<>c.<GetOrAdd>b__3_0(CacheKey ck)
   at System.Collections.Concurrent.ConcurrentDictionary`2.GetOrAdd(TKey key, Func`2 valueFactory)
   at Microsoft.EntityFrameworkCore.ValueGeneration.ValueGeneratorCache.GetOrAdd(IProperty property, IEntityType entityType, Func`3 factory)
   at Microsoft.EntityFrameworkCore.SqlServer.ValueGeneration.Internal.SqlServerValueGeneratorSelector.Select(IProperty property, IEntityType entityType)
   at Microsoft.EntityFrameworkCore.ChangeTracking.Internal.ValueGenerationManager.Generate(InternalEntityEntry entry)
   at Microsoft.EntityFrameworkCore.ChangeTracking.Internal.InternalEntityEntry.SetEntityState(EntityState entityState, Boolean acceptChanges, Nullable`1 forceStateWhenUnknownKey)
   at Microsoft.EntityFrameworkCore.ChangeTracking.Internal.EntityGraphAttacher.PaintAction(EntityEntryGraphNode node, Boolean force)
   at Microsoft.EntityFrameworkCore.ChangeTracking.Internal.EntityEntryGraphIterator.TraverseGraph[TState](EntityEntryGraphNode node, TState state, Func`3 handleNode)
   at Microsoft.EntityFrameworkCore.DbContext.SetEntityState[TEntity](TEntity entity, EntityState entityState)
   at EnumValueGeneratedOnAdd.Program.Main(String[] args) in C:\Users\Christiaan\Documents\Visual Studio 2017\Projects\EnumValueGeneratedOnAdd\EnumValueGeneratedOnAdd\Program.cs:line 45

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

Metadata

Metadata

Assignees

No one assigned

    Type

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions