我想使用数据库跟踪一些工作,使用State
和Status
等表格。每个Status
表都有一个FK到State
。有效状态可能类似于“转移”,并且其状态可能是“活跃的”状态。或者'已完成'。会有第三个表(可能是StatusEvent
)。我使用Entity Framework 6.0映射到数据库。
我试图找出的一件事是如何在我的C#代码中正确表示这些状态和状态。例如,可能存在以下状态:
StateId Name
1 active
2 complete
3 error
在我的代码中,我想将状态设置为“活动”状态。我可以找到匹配文本'活跃'的StateId。然后使用它。也许用ToLower()
或其他东西让它更安全一些。我还可以保留一份州名列表。像const int Active = 1
这样的东西。但是我需要确保db中没有任何真正的变化......
最后,我希望能够调用类似SetStateOnStatus(int statusId, State state)
的方法。
我从实体框架中查看了Enum的东西 - 实际上似乎没有用,因为状态描述只是在代码中,而db只包含一个int。我需要在另一个表中包含这些描述,以便稍后查询数据库。也许我在这里错过了什么?
那么这样做的正确方法是什么?
答案 0 :(得分:1)
正如罗伯特所说,使用查找表是很好的。 您可以创建valid_status和valid_state表,您可以在其中填写用户定义的值,如上所述。无论何时插入状态,都要从状态表中获取状态。以类似的方式,您可以获取stateid,而不是传递为硬编码值。
答案 1 :(得分:1)
你真的需要州桌吗?如果要修复状态中的值,则可以创建类似于代码中建议的枚举。 (映射到它们的整数将执行 - public enum State {Active(1),..;}) 这将节省您的时间,使您无需进行数据库调用。
您可以创建状态表,但不能使用State的外键,而是可以拥有State列。这将包含从枚举中检索的int值。
当您调用setStateOnStatus(..)时,您可以进行数据库调用,并将信息保存在那里。
如果State中的值经常变化,那么我想拥有State表是有意义的
答案 2 :(得分:0)
因此我不会将此标记为答案,因为我不知道这是否是最佳方式。但我最终做的是使用t4模板使用similar to this(但不完全相同)来保存/运行模板生成时生成枚举。然后我将这些枚举用于我的方法调用。