我有一个数据对象(假设它叫做'Entry'),它有一组看起来像这样的潜在状态:

1 - Created
2 - File added
3 - Approved
4 - Invalid

这在数据库中表示为带有自动编号主键的“状态”表,然后是主表中的“StatusId”字段,并设置了适当的关系。

在我的(自定义)数据层中,我有'Entry'对象,而且,目前,我还声明了一个Enum,其中列出了上面列出的状态。最后,我声明了这个枚举的私有实例以及相应的公共属性。

在我的'Commit()'方法中,我将Enum的实例转换为整数并将其传递给Update存储过程。

在我的静态'GetEntry()'方法中,我显然会从数据库传回一个整数。然后我使用'Enum.Parse()'方法来提取一个对象,该对象是我的Enum的一个实例,它对应于返回的状态整数。我将它转换为我的Enum类型并将其分配给本地私有变量。

我的问题非常简单 - 这种方法是否合适,如果没有替代方案,除了存储原始整数值(我不一定反对)之外,还是更好。

我的理由是,这一切对我来说似乎非常混乱,所有投射和维护同一组值的两个列表是什么。我接受的好处在于为数据对象的消费者提供更好的体验,但即便如此......

谢谢!

有帮助吗?

解决方案

我们的一个项目中有一些熟悉的东西。 我们有一个包含项目类型的表。这些类型有一个id,在代码中我们有一个具有相同id的枚举。 问题是,在数据库中我们不使用自动编号(身份),因此我们可以完全控制id。 保存对象时,我们只需要使用枚举的id来保存对象。 我也认为这种方法很混乱,但事后并不是那么糟糕。

其他提示

这种方法对我来说似乎很好。

过去我做了同样的事情,但是还有一个表,其中包含枚举的每个成员的行,那么表就是使用枚举值的任何表的外键,只是有人读取数据库可以理解每个状态是什么,而不必看到实际的枚举。

例如,如果我有一个类似

的枚举
enum status
{
    Active,
    Deleted,
    Inactive
}

我会有一个名为status的表,它具有以下记录

ID  名称结果 0   活动结果 1   删除的结果 2   非活性

该表将成为使用该枚举的任何表的外键。

是的,这很好!

请始终明确设置这样的值。这样,如果有人去添加一些东西,他们会意识到价值是重要的,不应该被搞砸。

enum status
{
    Active = 1,
    Deleted = 2,
    Inactive = 3
}

如果您通过WCF传递值,我建议添加

  NULL = 0

否则,如果您尝试序列化来自数据库的0,您将收到一个可怕的错误,它将花费你永远的调试。

数据库查找表是必要的;程序化枚举很方便避免在代码中使用“幻数”

但是,如果您的代码不需要操作状态,那么枚举是不必要的

我一直用Enums做这个方法。如果它是一个简单的项目,如状态,预计不会改变,我更喜欢Enum。解析和转换是一个影响非常小的操作。

我已经成功地使用Linq to Sql做了一段时间,没有任何问题。 Linq实际上会从Enum转换为int并自动返回。

代码不仅仅是速度,还有可读性。枚举使代码可读。

直接回答你的问题,这是一个非常有效的应用程序。

如果您的代码需要设置已知的“状态”值(你在你的枚举中定义的),那么它可能也是那些“状态”的要求。值存在于数据库中。由于它们必须存在,因此您还应该控制分配给每个值的Status_ID。

删除标识,只显式设置查找值ID。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top