Usando um enum como chave primária com EF

É possível usar um enum como chave primária para uma tabela? Eu tenho algo parecido com o seguinte:

public enum SpecialId : uint {} public class Thing { public SpecialId Id { get; set; } } public class MyContext : DbContext { public DbSet Things { get; set; } } 

Mas eu recebo o seguinte erro na boot:

Uma exceção sem controle do tipo ‘System.InvalidOperationException’ ocorreu em EntityFramework.dll

Informações adicionais: O componente-chave ‘Id’ não é uma propriedade declarada no tipo ‘Coisa’. Verifique se ele não foi explicitamente excluído do modelo e se é uma propriedade primitiva válida.

Isso significa que ele precisa ser primitivo (um enum só pode ser convertido em primitave), mas o post da EF em torno de enums sugere que isso é possível

Enums como chaves

Além disso, as propriedades dos tipos enum podem participar da definição de chaves primárias, restrições exclusivas e foreign keys, bem como participar de verificações de controle de concorrência e ter valores padrão declarados.

Estou fazendo algo errado ou isso simplesmente não é suportado?

De um lado não sei que eu poderia hackear esta funcionalidade usando outra propriedade com não mapeado para traduzir chaves para enums. Esta não é a resposta que estou procurando

Isso não funciona porque seu enum é baseado em uint. O EF não suporta tipos integrais não assinados em geral (ou seja, você poderia usar o tipo uint para uma propriedade) e, portanto, não funcionará também para propriedades de enum.

Eu pessoalmente não sou um grande fã de chaves enum. Aqui está apenas um par de razões:

  • os valores no database podem sair de sincronia muito facilmente com a sua definição de enum
  • isso pode ser quebrado fora da checkbox se o database gerar as chaves – geralmente o database começa a gerar IDs de 1, mas o primeiro membro de enum é 0
  • Os tipos de enumeração geralmente possuem apenas algumas constantes / membros. Embora seja possível ter valores que estejam no intervalo do tipo subjacente enum mas não tenham uma constante correspondente no tipo enum (e o EF suporta isso) isso anula o propósito de usar o tipo enum

Parece que o problema é com o tipo subjacente enum .

Eu não encontrei nenhuma informação, mas um teste rápido mostra que os seguintes tipos são suportados

 byte, short, int, long 

e os seguintes não são

 sbyte, ushort, uint, ulong