在switch语句中使用标识字段

时间:2009-09-30 10:19:55

标签: c# switch-statement identity

我有一个这样的SQL查找表:

CREATE TABLE Product(Id INT IDENTITY PRIMARY KEY, Name VARCHAR(255))

我已将ASP.NET DropDownList数据绑定到LLBLGen实体。用户选择产品,并保存ID。现在我需要稍后显示一些产品特定的细节。我应该使用产品的ID,并希望安装之间的ID始终相同吗?

switch (selectedProduct.Id)
{
case 1: //product one
  break;
case 2:
case 3: //product two or three
  break;    
}

或使用该名称,并希望永远不会改变?

switch (selectedProduct.Name)
{
case "product one":
  break;    
}

或者有更好的选择吗?

4 个答案:

答案 0 :(得分:2)

如果您知道此表中的所有项目(我猜您可以对它们进行切换)并希望每次安装都相同,那么它可能不应该是标识列,您应该插入1 ,2,3,产品本身。

答案 1 :(得分:1)

如果您希望修复ProductID(这似乎不是一个好主意),那么您可以使用IDENTITY INSERT(至少在SQL Server中)以确保安装之间的ProductID值相同。但是,我通常只对静态参考数据执行此操作。

您还可以使用Visual Studio的T4模板直接从数据库数据生成enums

答案 2 :(得分:1)

对于这种情况,我看到了三种常见的解决方案:

  1. 硬编码ID - 这是快速而肮脏的,不是自我记录的(您不知道正在引用什么产品),并且如您所指出的那样容易破损。我再也不会使用这种方法了。
  2. 枚举 - 当表格小且静态时,我会使用此功能。因此,ProductType可能是这个的候选者。这是自我记录的代码,但仍然在代码和数据之间创建一个尴尬的连接,如果插入的记录的ID不同于您计划的ID,那么事情就会中断。您可以通过各种方式自动化Enum生成来缓解这种情况,但它仍然感觉不对。例如,如果您的单元测试将记录插入到Product表中,那么他们将很难在那时重新创建Enum。此外,如果你有100,000条记录,那么Enum方法看起来很愚蠢。
  3. 添加其他列,这是一个不变的标识符。我经常使用AlphaCode作为我的列名。所以在你的情况下它看起来像:
  4.     switch (selectedProduct.AlphaCode)
        {
            case "PRODUCT_ONE":
                break;
    }
    这使您可以使用自我记录的AlphaCode,允许您重新插入数据而无需关心自动增量PK值,并允许您更改产品名称而不会影响任何内容。如果使用AlphaCode方法,请确保在此列上放置唯一索引。

    另一种解决方案通常是最优选的解决方案,即将此逻辑移至数据库。例如,如果产品1是您在选择其类别时默认显示的产品,则可以在表中添加一个名为IsHeroProduct的列。然后您的查询变为:

        if (selectedProduct.IsHeroProduct)
        {
            //do stuff
    }

答案 3 :(得分:0)

一些ORM(至少LLBLGen)可以为您处理;但产生一种强大的枚举。我从来没有用过它。

在这些情况下,我总是选择自己编写的枚举,但我确保所有字段都相同,如果有任何更改,则更新。当你在数据库中工作时会变得更有趣(就像我一样),但是如果你小心,它就足够了。