将枚举用作EF的主键

Not*_*ple 4 c# entity-framework

是否可以将枚举用作表的主键?我有类似以下内容:

public enum SpecialId : uint {}

public class Thing 
{
     public SpecialId Id { get; set; }
}

public class MyContext : DbContext
{
     public DbSet<Thing> Things { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

但是我在初始化时遇到以下错误:

EntityFramework.dll中发生了'System.InvalidOperationException'类型的异常处理

附加信息:关键组件“ Id”不是类型为“事物”的声明属性。验证尚未将其显式排除在模型之外,并且它是有效的原始属性。

这确实表明它必须是原始的(一个枚举只能转换为原始),但是围绕枚举EF帖子建议这是可能的

枚举作为键

此外,枚举类型的属性可以参与主键,唯一约束和外键的定义,还可以参与并发控制检查,并具有默认值。

我是在做错什么,还是根本不支持?

一方面,我不知道我可以使用另一个没有映射的属性来破解此功能,以将键转换为枚举。这不是我要找的答案

Paw*_*wel 5

这不起作用,因为您的枚举基于uint。EF通常不支持无符号整数类型(即,您可以将uint类型用于属性),因此它也不适用于枚举属性。

我个人不是枚举键的忠实拥护者。这只是几个原因:

  • 数据库中的值可以很容易地与您的枚举定义不同步
  • 如果数据库生成密钥,则可以打破常规—通常数据库从1开始生成ID,但是第一个枚举成员为0
  • 枚举类型通常只有几个常量/成员。尽管可能具有在枚举基础类型范围内的值,但在枚举类型中没有对应的常量(并且EF支持此值),但这违反了使用枚举类型的目的