在实体框架中使用单独的枚举表(实体),不需要连接

本文关键字:实体 不需要 连接 枚举 框架 单独 | 更新日期: 2023-09-27 17:49:36

我有一个实体Person,它有一个enum "State",值为"new, accepted, blocked"。实体框架代码首先在person表上创建一个字段,其中1代表new, 2代表accepted, 3代表blocked。只要在代码视图中就行。当我需要修复一个数据库时,无论出于什么原因,"1"没有任何意义,我都需要首先在代码中查找1对该枚举的意义。

我的第一个想法是简单地为这些枚举创建一个单独的表,并使枚举成为具有id和枚举的类。但是,在需要枚举的每个查询上,我得到另一个(不必要的)连接。我想避免这种情况。

所以,是否有可能有一个单独的表与固定id的枚举,使枚举表的id等于枚举的值,仍然有实体框架使用正常的方法,它只是使用枚举的值作为保存值?当我想使用外键来强制引用完整性以确保没有人忘记更新enum表时,我遇到了问题。实体框架不能设置这个外键,因为它不知道表,当它知道它,它使关系,我也不想因为连接。

在实体框架中使用单独的枚举表(实体),不需要连接

几年过去了,我学到了很多。因此,如果有人看到这个问题并想知道,以下是我今天通常做的事情。

所以,除非有一个特殊的原因,实际上有一个表的代码(枚举)值(比如当你有额外的数据,而不仅仅是一个代码),我只是把枚举值放入使用枚举的表。例如,在上面的例子中,person表获得enum值的整数列。在c#实体框架中,我这样使用它:

// write to db:
personEntity.PersonState = (int)State.New;
// read from db, e.g.:
if (personEntity.PersonState == (int)State.New {
  // logic here
}
// or if you need the value as enum:
State personState = (State)personEntity.PersonState;

我发现在大多数情况下,这是一个很好的和简单的方法。

试试下面的代码

Module Module1
    Enum MyEnum
        a = 1
        b
        c
        d
        e
        f = 100
    End Enum
    Sub Main()
        Dim x As MyEnum = MyEnum.d
        Console.WriteLine(x)
        Console.ReadLine()
    End Sub
End Module
​