使用枚举作为EF

时间:2016-02-04 21:02:52

标签: 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; }
}

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

  

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

     

附加信息:关键组件“Id”不是“Thing”类型的声明属性。验证它是否未从模型中明确排除,并且它是有效的原始属性。

这确实说它需要是一个原语(枚举只能转换为primitave),但EF post around enums表明这是可能的

  

枚举为关键

     

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

我做错了还是根本不支持?

一方面我不知道我可以使用另一个没有映射到它的属性来破解这个功能,以便将密钥转换为枚举。这是我正在寻找的答案

2 个答案:

答案 0 :(得分:4)

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

我个人不是枚举键的忠实粉丝。这只是几个原因:

  • 数据库中的值可能很容易与您的枚举定义不同步
  • 如果数据库生成密钥,则可以将其打开 - 通常数据库开始从1生成ID,但第一个枚举成员为0
  • 枚举类型通常只有几个常量/成员。虽然可以使枚举基础类型范围内的值但在枚举类型中没有相应的常量(并且EF支持此类),但这会使使用枚举类型的目的失败

答案 1 :(得分:3)

看起来问题出在enum基础类型上。

我没有找到任何信息,但快速测试显示支持以下类型

byte, short, int, long

以下不是

sbyte, ushort, uint, ulong