在C#中使用Enum作为数据层对象的“状态”
-
03-07-2019 - |
题
我有一个数据对象(假设它叫做'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。