可以使用C#中的枚举替换Lookup表(例如SportType,MatchType)

时间:2012-03-03 05:27:31

标签: c# asp.net .net sql-server database

我在数据库中有一些表。只有两个

1-Sports
2-Match<>
.......
In sports table there is columns SportType<br>
and In Match table there is column MatchType

选项1:
    我可以选择创建SportType和MatchType表

选项2:
    第二个选项是创建运动类型和匹配类型的枚举

由于查询中的额外联接,有些人不喜欢选项1 你的建议

我还需要展示SportType&amp; DropDownLists中的MatchType

2 个答案:

答案 0 :(得分:1)

在查找表和枚举或类似的代码内常量之间进行选择时,需要考虑几个因素。这些因素中的主要问题是,如果不重新部署应用程序,您必须添加或修改任何这些值的可能性。

要记住的另一件事是,如果您使用内嵌代码值,则不太可能使用任何类型的代理键,因此如果您决定更改代码中某些内容的拼写,您可能会创建数据库中数据不匹配的问题。

由于您还需要在下拉列表中显示这些类型,因此我建议不要使用裸枚举,因为显示界面友好的版本(例如,单词之间有空格)会变得很容易。

最简单的替代方法是具有字符串常量的类:

public class SportType
{
    public const string TeamSport = "Team Sport";
    public const string IndividualSport = "IndividualSport";
}

更复杂的选项,但对于这个用例可能是不必要的,是使这些对象强类型化:

public class SportType
{
    private readonly string _description;

    private SportType(string description)
    {
        _description = description;
    }

    public static readonly SportType TeamSport = new SportType("Team Sport");
    public static readonly SportType IndividualSport = new SportType("Individual Sport");

    public static implicit operator SportType(string s)
    {
        return new SportType(s);
    }

    public static implicit operator string(SportType s)
    {
        return s._description;
    }

    // equality overrides etc.
}

这里的优点是您可以将这些值用作字符串

string sportType = SportType.TeamSport;

但您不必将变量和参数声明为裸字符串:

public void SetFavoriteSportType(SportType sportType)

同样,这些只是选项;最终归结为如何部署您的应用程序以及如何修改这些数据。

答案 1 :(得分:1)

我认为enum方法的问题在于你必须添加新的SportTypes和MatchTypes。如果您的下拉列表绑定到那些枚举,则每次更改时都必须重新部署