我有一个这样的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;
}
或者有更好的选择吗?
答案 0 :(得分:2)
如果您知道此表中的所有项目(我猜您可以对它们进行切换)并希望每次安装都相同,那么它可能不应该是标识列,您应该插入1 ,2,3,产品本身。
答案 1 :(得分:1)
如果您希望修复ProductID(这似乎不是一个好主意),那么您可以使用IDENTITY INSERT
(至少在SQL Server中)以确保安装之间的ProductID值相同。但是,我通常只对静态参考数据执行此操作。
您还可以使用Visual Studio的T4模板直接从数据库数据生成enums
答案 2 :(得分:1)
对于这种情况,我看到了三种常见的解决方案:
switch (selectedProduct.AlphaCode)
{
case "PRODUCT_ONE":
break;
}
这使您可以使用自我记录的AlphaCode,允许您重新插入数据而无需关心自动增量PK值,并允许您更改产品名称而不会影响任何内容。如果使用AlphaCode方法,请确保在此列上放置唯一索引。
另一种解决方案通常是最优选的解决方案,即将此逻辑移至数据库。例如,如果产品1是您在选择其类别时默认显示的产品,则可以在表中添加一个名为IsHeroProduct的列。然后您的查询变为:
if (selectedProduct.IsHeroProduct)
{
//do stuff
}
答案 3 :(得分:0)
一些ORM(至少LLBLGen)可以为您处理;但产生一种强大的枚举。我从来没有用过它。
在这些情况下,我总是选择自己编写的枚举,但我确保所有字段都相同,如果有任何更改,则更新。当你在数据库中工作时会变得更有趣(就像我一样),但是如果你小心,它就足够了。