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

C# 使用映射到数据库中某些种子数据的枚举是一种不好的做法吗?,c#,enums,C#,Enums,我的数据库中有一个名为OrderItemType的表,它有大约5条记录用于我的系统中不同的OrderItemType。每个OrderItem都包含一个OrderItemType,这为我提供了引用完整性。在我的中间层代码中,我还有一个与此表中的值匹配的枚举,这样我就可以拥有不同类型的业务逻辑 我的开发经理说他讨厌人们这样做,我也不知道为什么。是否有更好的做法值得我遵循?我认为在数据库中存储枚举值没有任何问题,这实际上可以防止代码处理无效的代码类型。事实上,在我开始这样做之后,我的问题开始减少。您的

我的数据库中有一个名为OrderItemType的表,它有大约5条记录用于我的系统中不同的OrderItemType。每个OrderItem都包含一个OrderItemType,这为我提供了引用完整性。在我的中间层代码中,我还有一个与此表中的值匹配的枚举,这样我就可以拥有不同类型的业务逻辑


我的开发经理说他讨厌人们这样做,我也不知道为什么。是否有更好的做法值得我遵循?

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

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

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

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

我一直这样做,我看不出这有什么不对。事实上,有些值是应用程序特有的,您的代码需要对这些值做出不同的反应。您的经理希望您硬编码Int或GUID来标识类型吗?或者他希望您从OrderItem中为数据库中的每种不同类型派生一个特殊对象?这两个都比枚举糟糕得多。

我一直在这样做,我看不出这有什么错。事实上,有些值是应用程序特有的,您的代码需要对这些值做出不同的反应。您的经理希望您硬编码Int或GUID来标识类型吗?或者他希望您从OrderItem中为数据库中的每种不同类型派生一个特殊对象?这两种类型都比枚举糟糕得多。

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

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


每次添加订单类型时,都必须为其添加业务逻辑。因此,无论它是否是枚举,它都有理由存在于您的业务领域中。但是,在这种情况下,将它放在数据库中对您没有任何帮助。

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

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


每次添加订单类型时,都必须为其添加业务逻辑。因此,无论它是否是枚举,它都有理由存在于您的业务领域中。但是,在这种情况下,将其放在数据库中对您没有任何帮助。

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

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

有助于同步数据库值和业务逻辑枚举值的一个替代方法是使用EnumBuilder类从数据库动态生成包含当前枚举值的.dll。然后,您的业务逻辑可以引用它,并具有intellisense支持的同步化枚举值

事实上,这比听起来要简单得多

这里有一个指向MSDN的链接,解释如何动态构建枚举。


您只需在数据库访问代码中加入子项即可获取枚举值:

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

事实上,这比听起来要简单得多

这里有一个指向MSDN的链接,解释如何动态构建枚举。


您只需在数据库访问代码中加入子项即可获取枚举值:

再投您一票,我还使用mapping database int application enum,此外,我通常这样描述我的枚举:

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; }
    }
}
这使我完全可以自由地添加新值,而无需更改数据库,并且只需很短的变通方法,即可使用包含与值紧密关联的描述的列表只要一点点反思就达到了目的

在代码中,通常可以添加如下属性:

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; }
    }
}

再投你一票,我还使用映射数据库int应用程序enum,另外 n、 我通常这样描述我的枚举:

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; }
    }
}
这使我完全可以自由地添加新值,而无需更改数据库,并且只需很短的变通方法,即可使用包含与值紧密关联的描述的列表只要一点点反思就达到了目的

在代码中,通常可以添加如下属性:

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; }
    }
}

您假设OrderType是一个基于订单性质的计算值,否则,您不一定能够从数据库中重新水化该对象。@Jacob不,我不是假设它是计算的,用户可以将其作为字段存储在OrderItem记录中,而不是使用整个子表来跟踪它。我的观点是,创建OrderItemType表没有太大的必要,但他仍然需要在OrderItem中保留枚举值。@Joseph:啊,在数据库中删除它的注释听起来好像你在提倡完全删除它。对不起,误会了。我喜欢将数据规范化,以便在必要时可以更容易地将其命名为显示。@Jacob啊,是的,这是有意义的,但这是一个单独的要求,有它自己的顾虑。但我完全明白你的意思。你假设OrderType是一个基于订单性质的计算值,否则,你不一定能够从数据库中重新对对象进行水化。@Jacob不,我不是假设它是计算的,用户可以将它作为字段存储在OrderItem记录中,而不是有一个完整的子表来跟踪它。我的观点是,创建OrderItemType表没有太大的必要,但他仍然需要在OrderItem中保留枚举值。@Joseph:啊,在数据库中删除它的注释听起来好像你在提倡完全删除它。对不起,误会了。我喜欢将数据规范化,以便在必要时可以更容易地将其命名为显示。@Jacob啊,是的,这是有意义的,但这是一个单独的要求,有它自己的顾虑。但我明白你的意思。