将枚举存储到数据库的平滑方法
Smooth way to store enum to a DB
我有一个 enum 像这样。
public enum TimeFrame
{
Morning = 1,
Afternoon,
Evening
}
当存储包含 TimeFrame 类型属性的对象时,会使用 switch 语句进行转换,使每个值明确为 1 、2 和 3。创建的命令字符串被替换为例如Evening 到 3。从 DB 获取时也是如此 - 如果值为 1,则它被手动显式映射到 Morning.
是否有一种平滑的方法来存储 enum "as is" 的值?还是我们应该出于某种原因避免这样做?
我试过直接的方法,但一直只给出回退值...
TimeFrame = row["TimeFrame"] as TimeFrame? ?? TimeFrame.Morning
您可以将枚举转换为整数,反之亦然,这非常快。您还可以在枚举和字符串之间进行转换,需要更多的代码、时间和存储空间。然后,您可以在数据库中简单地存储整数或字符串。
如果由于某种原因 O/R-mapper(或您使用的任何技术)无法处理枚举值,您可以创建一个 int
属性 翻译您的枚举:
// Do not map!
public TimeFrame TimeFrame { get; set; }
// Map!
public int TimeFrameInt {
get { return (int)TimeFrame; }
set { TimeFrame = (TimeFrame)value; }
}
ints 和 enums 之间的转换仅通过强制转换完成;不需要 switch 语句。这是可能的并且非常快,因为枚举在引擎盖下由整数表示。
我有一个 enum 像这样。
public enum TimeFrame
{
Morning = 1,
Afternoon,
Evening
}
当存储包含 TimeFrame 类型属性的对象时,会使用 switch 语句进行转换,使每个值明确为 1 、2 和 3。创建的命令字符串被替换为例如Evening 到 3。从 DB 获取时也是如此 - 如果值为 1,则它被手动显式映射到 Morning.
是否有一种平滑的方法来存储 enum "as is" 的值?还是我们应该出于某种原因避免这样做?
我试过直接的方法,但一直只给出回退值...
TimeFrame = row["TimeFrame"] as TimeFrame? ?? TimeFrame.Morning
您可以将枚举转换为整数,反之亦然,这非常快。您还可以在枚举和字符串之间进行转换,需要更多的代码、时间和存储空间。然后,您可以在数据库中简单地存储整数或字符串。
如果由于某种原因 O/R-mapper(或您使用的任何技术)无法处理枚举值,您可以创建一个 int
属性 翻译您的枚举:
// Do not map!
public TimeFrame TimeFrame { get; set; }
// Map!
public int TimeFrameInt {
get { return (int)TimeFrame; }
set { TimeFrame = (TimeFrame)value; }
}
ints 和 enums 之间的转换仅通过强制转换完成;不需要 switch 语句。这是可能的并且非常快,因为枚举在引擎盖下由整数表示。