枚举绑定到数据库

时间:2014-03-13 02:13:14

标签: c# data-binding enums abstract-class

在为现有应用程序编写代码时,开发数据库环境通常与生产环境不匹配 - 更糟糕的是,有时候覆盖环境只是一种选择。

我想到的所有环境代码的一个想法是使用数据绑定枚举,其值将绑定到它们所代表的数据项的ID。我无法使用Enum,但我能够通过抽象类来解决它。例如:

public abstract class Colors
{
    private static readonly string c_red    = "red";
    private static readonly string c_blue   = "blue";
    private static readonly string c_yellow = "yellow";
    private static readonly string c_green  = "green";

    private static int? _red    = null;
    private static int? _blue   = null;
    private static int? _yellow = null;
    private static int? _green  = null;

    public static int Red
    {
        get
        {
            if (_red == null)
                _red = GetColorID(c_red);

            return (int)_red;
        }
    }
    public static int Blue
    {
        get
        {
            if (_blue == null)
                _blue = GetColorID(c_blue);

            return (int)_blue;
        }
    }
    public static int Yellow
    {
        get
        {
            if (_yellow == null)
                _yellow = GetColorID(c_yellow);

            return (int)_yellow;
        }
    }
    public static int Green
    {
        get
        {
            if (_green == null)
                _green = GetColorID(c_green);

            return (int)_green;
        }
    }

    private static int GetColorID(string identifier)
    {
        using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["Demo"].ConnectionString))
        {
            conn.Open();

            using (SqlCommand cmd = new SqlCommand("spGetColorId", conn))
            {
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.Parameters.AddWithValue("Name", identifier);

                return Convert.ToInt32(cmd.ExecuteScalar());
            }
        }
    }
}

通过这种方式,我可以在此示例中调用Colors.Red来获取Red的ID,无论我是在Dev,Testing还是Production。

我的问题是:这真的是实现这一目标的理想方法吗?是否存在数据绑定枚举的本地到C#方法,或类似于我上面所做的事情?

1 个答案:

答案 0 :(得分:0)

拥有枚举意味着值很少(如果有的话)发生变化。您可以将其视为一个封闭的值列表(如一周中的几天等)。

由于枚举的这种性质,我觉得可以接受这样的冗余:枚举基础值被指定两次(一次在DB中,另一次在枚举本身中)。

如果您担心出现差异,可以在应用程序启动时对值进行验证,并检查值是否具有正确的对应ID,以及枚举中的值数是否与数据库中的值数相匹配。