使用枚举映射到数据库中的某些种子数据是不好的做法吗?

时间:2010-04-29 16:31:13

标签: c# enums

我的数据库中有一个名为“OrderItemType”的表,它对我系统中的不同OrderItemTypes有大约5条记录。每个OrderItem都包含一个OrderItemType,这给了我参照完整性。在我的middletier代码中,我还有一个与此表中的值匹配的枚举,以便我可以为不同类型提供业务逻辑。

我的开发经理说,当人们这样做时,他讨厌它,我不确定为什么。我应该遵循更好的做法吗?

7 个答案:

答案 0 :(得分:4)

我一直这样做,我觉得这没什么不对。事实上,有些值对您的应用程序来说是特殊的,您的代码需要对这些值做出不同的反应。您的经理是否会对Int或GUID进行硬编码以识别类型?或者他宁愿你从OrderItem中为数据库中的每个不同类型派生一个特殊对象?这两个都比枚举更糟糕。

答案 1 :(得分:0)

我没有看到存储在数据库中的枚举值有任何问题,这实际上阻止了您的代码处理无效的代码类型。在我开始这样做之后,我开始遇到的问题更少了。你的经理是否为他的仇恨提供任何理由?

答案 2 :(得分:0)

我们也这样做。在我们的数据库中,我们有一个Int列,我们将其映射到代码中的Enum值。

答案 3 :(得分:0)

如果您对每种特定类型都有真正的业务问题,那么我会保留枚举并将其丢弃在数据库中。

这种方法背后的原因很简单:

每次添加OrderType时,您都必须为其添加业务逻辑。这样就可以证明它在某个地方(无论是否为枚举)存在于您的业务领域。但是,在这种情况下,在数据库中使用它不会为您做任何事情。

答案 4 :(得分:0)

我已经看到这样做是出于性能原因,但我认为在大多数情况下使用缓存机制是可行的。

答案 5 :(得分:0)

帮助同步数据库值和业务逻辑枚举值的另一种方法是使用EnumBuilder类动态生成包含数据库中当前枚举值的.dll。然后,您的业务逻辑可以引用它,并具有智能感知支持的同步枚举值。

实际上它听起来要复杂得多。

这是MSDN的链接,用于解释如何动态构建枚举 http://msdn.microsoft.com/en-us/library/system.reflection.emit.enumbuilder.aspx

您只需要在数据库访问代码中获取枚举值:

答案 6 :(得分:0)

再一次投票给你,我也使用map database int< - >应用程序枚举,另外,我通常会这样描述我的枚举:

public enum Operation
{
    [Description("Add item")]
    AddItem = 0,

    [Description("Remove item")]
    RemoveItem = 1
}

让我完全自由地添加新值而无需更改数据库,并且我可以使用非常短的解决方法,即包含描述的列表(与值非常紧密相关!) - 只需要一点点反射就可以了目标!

在代码中,您通常只需添加如下属性:

public class Order
{
    public int OrderTypeInt;

    public OrderTypeEnum OrderType
    {
        get { return (OrderTypeEnum)OrderTypeInt; }
        set { OrderTypeInt = (int)value; }
    }
}