2009-03-03 81 views
2

我有一个数据对象的数据层对象的“状态”(让我们说这就是所谓的“入门”),有一组是这个样子的潜在状态:使用枚举在C#中

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

这在数据库中用一个带有自动编号主键的'状态'表来表示,然后在主表中设置一个'状态标识'字段,并建立适当的关系。

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

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

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

我的问题很简单 - 这种方法是否合适,如果不是什么替代方案,除了存储原始整数值(我不一定反感),更好。

我的要求是,这一切似乎令人难以置信的混乱对我来说,什么与所有铸造和维护同一组值的两个列表。我接受的好处在于为数据对象的消费者提供更好的体验,但即使如此...

谢谢!

回答

3

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

1

该方法对我来说似乎很好。

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

例如,如果我有一个像

enum status 
{ 
    Active, 
    Deleted, 
    Inactive 
} 

枚举我将有一个表叫做状态,将有如下记录

ID    名称
   活动
   删除
   不活动

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

+0

“这是在数据库中用'自动编号主键'的'状态'表格表示的;-) – 2009-03-03 15:00:57

+0

是的,这不起作用,因为默认情况下枚举从0开始编号。祝你好运固定的状态:) – leppie 2009-03-03 15:08:52

+0

我的坏,修正:) – Gavin 2009-03-03 15:10:57

0

数据库查找表是必要的;该程序枚举方便,避免在代码中有“幻数”

,如果你的代码并不需要操作的状态,不过,那么枚举是不必要的

0

我做到这一点的办法与枚举所有的时间。如果它是一个简单的项目,如状态,预计不会改变我宁愿Enum。解析和投射是一个影响非常小的操作。

我一直在成功地使用Linq to Sql一段时间没有问题。 Linq实际上将从Enum转换为int并自动返回。

代码不仅仅是速度而是可读性。枚举使代码可读。

要直接回答你的问题,这是一个非常有效的apporach。

0

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

删除标识并明确设置查找值标识。

1

是的,这很好!

请始终明确地设置像这样的值。这样,如果有人曾经添加过一些东西,他们会意识到这些价值观很重要,不应该混淆。

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

如果您是通过WCF各地传递的价值,我建议增加

NULL = 0 

否则,如果你尝试序列0来自数据库,你会得到一个可怕的错误,它会带你永远调试。